package Ġnet . ake hur st . kotlin x . reflect . gradle . plugin Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . file . Regular File Property Ċ import Ġorg . gradle . api . logging . Logger Ċ import Ġorg . gradle . api . model . ObjectFactory Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Generation Extension Ċ import Ġorg . jetbrains . kotlin . cli . common . CLI Configuration Keys Ċ import Ġorg . jetbrains . kotlin . cli . common . messages . Compiler Message Severity Ċ import Ġorg . jetbrains . kotlin . cli . common . messages . Message Collector Ċ import Ġorg . jetbrains . kotlin . cli . jvm . config . jvm Mod ular Roots Ċ import Ġorg . jetbrains . kotlin . com . intellij . mock . Mock Project Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . Abstract Cli Option Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . Cli Option Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . CommandLine Processor Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . Component Registrar Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Key Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . Kotlin Compilation Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . Kotlin Compiler Plugin Support Plugin Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . Sub plugin Artifact Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . Sub plugin Option Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . js Resolve Libraries Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . moduleName Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . to Resolver Logger Ċ import Ġorg . jetbrains . kotlin . ir . util . Ir Message Logger Ċ import Ġorg . jetbrains . kotlin . js . config . JS Configuration Keys Ċ import Ġorg . jetbrains . kotlin . js . translate . extensions . Js Synt hetic Translate Extension Ċ import Ġorg . jetbrains . kotlin . resolve . extensions . Extra Imports Provider Extension Ċ import Ġjava . io . File Ċ Ċ class ĠKotlin x Reflect Gradle Plugin Ġ: ĠKotlin Compiler Plugin Support Plugin Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlogger : ĠLogger ĊĊĠĠĠ Ġoverride Ġfun Ġget Compiler Plugin Id (): ĠString Ġ= ĠKotlin Plugin Info . K OT LIN _ PLUGIN _ ID ĊĊĠĠĠ Ġoverride Ġfun Ġget Plugin Artifact (): ĠSub plugin Artifact Ġ= ĠSub plugin Artifact ( ĊĠĠĠĠĠĠĠ ĠgroupId Ġ= ĠKotlin Plugin Info . PROJECT _ GROUP , ĊĠĠĠĠĠĠĠ Ġartifact Id Ġ= ĠKotlin Plugin Info . PROJECT _ NAME , ĊĠĠĠĠĠĠĠ Ġversion Ġ= ĠKotlin Plugin Info . PROJECT _ VERSION ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Plugin Artifact For Native (): ĠSub plugin Artifact Ġ= ĠSub plugin Artifact ( ĊĠĠĠĠĠĠĠ ĠgroupId Ġ= ĠKotlin Plugin Info . PROJECT _ GROUP , ĊĠĠĠĠĠĠĠ Ġartifact Id Ġ= ĠKotlin Plugin Info . PROJECT _ NAME +" - native ", ĊĠĠĠĠĠĠĠ Ġversion Ġ= ĠKotlin Plugin Info . PROJECT _ VERSION ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġis Applicable ( kotlin Compilation : ĠKotlin Compilation < *> ): ĠBoolean Ġ Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( target : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġext Ġ= Ġtarget . extensions . create ( Kotlin x Reflect Gradle Plugin Extension . NAME , ĠKotlin x Reflect Gradle Plugin Extension :: class . java ) ĊĠĠĠĠĠĠĠ Ġtarget . configurations . create (" for Reflection ") ĊĠĠĠĠĠĠĠ Ġthis . logger = target . logger ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġapply To Compilation ( kotlin Compilation : ĠKotlin Compilation < *> ): ĠProvider < List < Sub plugin Option >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġkotlin Compilation . target . project ĊĠĠĠĠĠĠĠ Ġval Ġextension : Kotlin x Reflect Gradle Plugin Extension Ġ= Ġproject . extensions . getBy Type ( Kotlin x Reflect Gradle Plugin Extension :: class . java ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġensure Ġkotlinx - reflect Ġlib Ġis Ġa Ġdependency ĊĠĠĠĠĠĠĠ Ġval Ġgen Dir Ġ= ĠFile ( project . build Dir ," kotlin x Reflect / gen Src ") ĊĠĠĠĠĠĠĠ Ġgen Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġval Ġmodule File Ġ= ĠFile ( gen Dir ," Kotlin x Reflect For Module . kt ") ĊĠĠĠĠĠĠĠ Ġmodule File . createNew File () ĊĠĠĠĠĠĠĠ Ġlogger . debug (" compilation Name Ġ= Ġ${ kotlin Compilation . compilation Name }") ĊĠĠĠĠĠĠĠ Ġkotlin Compilation . compilation Name ĊĠĠĠĠĠĠĠ Ġval Ġmodule Safe Name Ġ= Ġproject . name . replace ( Regex ("[ ^ a - zA - Z 0 - 9 ] "), "_ ") ĊĠĠĠĠĠĠĠ Ġmodule File . print Writer (). use Ġ{ Ġpw Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpw . println (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġ$ module Safe Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ${ Kotlin x Reflect Ir Generation Extension . Kotlin x Reflect Register For Module ClassName } Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġfun Ġregister Used Classes () Ġ{ Ġ/* Ġpopulated Ġby ĠIR Ġgeneration Ġ*/ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġfun Ġclass For Name After Registration ( qualified Name : ĠString ): Ġkotlin . reflect . K Class < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . register Used Classes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnet . ake hur st . kotlin x . reflect . Kotlin x Reflect . class For Name ( qualified Name Ġ= Ġqualified Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkotlin Compilation . default Source Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kotlin . src Dir ( gen Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġclasses Ġrequired Ġfor Ġreflection Ġ( TODO : Ġcan Ġwe Ġde duce Ġthis Ġfrom Ġcode Ġanalysis ) ĊĠĠĠĠĠĠĠ Ġ// val Ġfor Reflection Ġ= Ġproject . configurations . get ByName (" for Reflection ") ĊĊĠĠĠĠĠĠĠ Ġ// TODO : Ġremove Ġkotlin Ġstdlib Ġstuff ĊĠĠĠĠĠĠĠ Ġval Ġfor Ref Files = extension . for Reflection . get (). distinct (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . join ToString ( java . io . File . path Separator ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġlogger . debug (" To Ġcompiler , Ġfor Reflection Ġ= Ġ$ for Ref Files ") ĊĠĠĠĠĠĠĠ Ġreturn Ġproject . provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub plugin Option ( key Ġ= ĠKotlin x Reflect CommandLine Processor . OPTION _ for Reflection , Ġvalue Ġ= Ġfor Ref Files ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ open Ġclass ĠKotlin x Reflect Gradle Plugin Extension ( objects : ĠObject Factory ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠNAME Ġ= Ġ" kotlin x Reflect " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfor Reflection Ġ= Ġobjects . list Property ( String :: class . java ) Ċ Ċ } Ċ Ċ @ Auto Service ( CommandLine Processor :: class ) Ċ class ĠKotlin x Reflect CommandLine Processor Ġ: ĠCommandLine Processor Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠ Ġconst Ġval ĠOPTION _ for Reflection Ġ= Ġ" for Reflection " ĊĠĠĠĠĠĠĠ Ġval ĠARG _ for Reflection Ġ= ĠCompiler Configuration Key < String >( OPTION _ for Reflection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġplugin Id : ĠString Ġ= ĠKotlin Plugin Info . K OT LIN _ PLUGIN _ ID ĊĊĠĠĠ Ġoverride Ġval Ġplugin Options : ĠCollection < Cli Option > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠCli Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoption Name Ġ= ĠOPTION _ for Reflection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Description Ġ= Ġ" string ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" list Ġof Ġlibraries Ġfor Ġreflection Ġaccess ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Option ( ĊĠĠĠĠĠĠĠ Ġoption : ĠAbstract Cli Option , ĊĠĠĠĠĠĠĠ Ġvalue : ĠString , ĊĠĠĠĠĠĠĠ Ġconfiguration : ĠCompiler Configuration ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( option . option Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPTION _ for Reflection Ġ-> Ġconfiguration . put ( ARG _ for Reflection , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unexpected Ġconfig Ġoption Ġ${ option . option Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Auto Service ( Component Registrar :: class ) Ċ class ĠKotlin x Reflect Component Registrar ( ĊĠĠĠ Ġprivate Ġval Ġdefault Reflection Lib s : ĠString Ċ ) Ġ: ĠComponent Registrar Ġ{ ĊĊĠĠĠ Ġ@ Suppress (" unused ") Ġ// ĠUsed Ġby Ġservice Ġloader ĊĠĠĠ Ġconstructor () Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġdefault Reflection Lib s Ġ= Ġ"" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġregister Project Components ( project : ĠMock Project , Ġconfiguration : ĠCompiler Configuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Collector Ġ= Ġconfiguration . get ( CLI Configuration Keys . MESSAGE _ COLLECT OR _ KEY , ĠMessage Collector . NONE ) ĊĊĠĠĠĠĠĠĠ Ġmessage Collector . report ( Compiler Message Severity . LOG GING , Ġ" mod ular Root Ġ= Ġ${ configuration . jvm Mod ular Roots }") ĊĊĠĠĠĠĠĠĠ Ġval Ġfor Reflection Ġ= Ġconfiguration . get ( Kotlin x Reflect CommandLine Processor . ARG _ for Reflection , Ġdefault Reflection Lib s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ( java . io . File . path Separator ). toList (). filter Not Ġ{ Ġit . isNull Or Blank () Ġ} ĊĊĠĠĠĠĠĠĠ Ġmessage Collector . report ( Compiler Message Severity . LOG GING , Ġ" configuration Ġ= Ġ${ configuration }") ĊĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġ Ġconfiguration . get ( JS Configuration Keys . LIBRARIES ) ĊĠĠĠĠĠĠĠ Ġif Ġ( null != dependencies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Resolved Dependencies Ġ= Ġjs Resolve Libraries ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration [ JS Configuration Keys . RE POSIT ORIES ] Ġ?: Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration [ Ir Message Logger . IR _ MESSAGE _ LOGGER ]. to Resolver Logger () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Resolved Dependencies . forEach Ġ{ Ġkotlin Library , Ġpackage Access Handler Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Collector . report ( Compiler Message Severity . LOG GING , Ġ" moduleName Ġ= Ġ${ kotlin Library . moduleName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" kotlin " != kotlin Library . moduleName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Access Handler . load Module Header ( kotlin Library ). package Fragment Name List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Collector . report ( Compiler Message Severity . LOG GING , Ġ" package Fragment Name Ġ= Ġ${ it }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Js Synt hetic Translate Extension . register Extension ( project , ĠKotlin x Reflect Js Synt hetic Translate Extension ( message Collector , Ġfor Reflection )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Analysis Handler Extension . register Extension ( project , ĠKotlin x Reflect Analysis Handler Extension ( message Collector , Ġfor Reflection )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtra Imports Provider Extension . register Extension ( project , ĠKotlin x Reflect Extra Imports Provider Extension ( message Collector , Ġfor Reflection )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Generation Extension . register Extension ( project , ĠKotlin x Reflect Ir Generation Extension ( message Collector , Ġfor Reflection )) ĊĊĠĠĠ Ġ} Ċ Ċ } ĊĊ