/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . room . processing . javac . kotlin Ċ Ċ import Ġkotlinx . metadata . jvm . Kotlin Class Header Ċ import Ġkotlinx . metadata . jvm . Kotlin Class Metadata Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Executable Element Ċ Ċ /** Ċ Ġ* ĠUtility Ġclass Ġfor Ġprocessors Ġthat Ġwants Ġto Ġrun Ġkotlin Ġspecific Ġcode . Ċ Ġ*/ Ċ internal Ġclass ĠKotlin Metadata Element ( ĊĠĠĠ Ġval Ġelement : ĠElement , ĊĠĠĠ Ġprivate Ġval Ġclass Metadata : ĠKotlin Class Metadata . Class Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfunction List : ĠList < Km Function > Ġby Ġlazy Ġ{ Ġclass Metadata . read Functions () Ġ} ĊĠĠĠ Ġprivate Ġval Ġconstructor List : ĠList < Km Constructor > Ġby Ġlazy Ġ{ Ġclass Metadata . read Construct ors () Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠExec utable Element . descriptor : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdescriptor () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġparameter Ġnames Ġof Ġthe Ġfunction Ġor Ġconstructor Ġif Ġall Ġhave Ġnames Ġembedded Ġin Ġthe ĊĠĠĠĠ Ġ* Ġmetadata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Parameter Names ( method : ĠExec utable Element ): ĠList < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Signature Ġ= Ġmethod . descriptor ĊĠĠĠĠĠĠĠ Ġval Ġparam List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction List . first OrNull Ġ{ Ġit . descriptor Ġ== Ġmethod Signature Ġ} ?. parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġconstructor List . first OrNull Ġ{ Ġit . descriptor Ġ== Ġmethod Signature Ġ} ?. parameters ĊĠĠĠĠĠĠĠ Ġreturn Ġparam List ?. map Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġprimary Ġconstructor Ġdescriptor Ġof Ġthe Ġclass . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Primary Constructor Signature () Ġ= Ġconstructor List . first Ġ{ Ġit . is Primary () Ġ}. descriptor ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġa Ġmethod Ġis Ġa Ġsuspend Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Suspend Function ( method : ĠExec utable Element ) Ġ= Ġfunction List . first OrNull Ġ{ ĊĠĠĠĠĠĠĠ Ġit . descriptor Ġ== Ġmethod . descriptor ĊĠĠĠ Ġ} ?. is Suspend () Ġ?: Ġfalse ĊĊĠĠĠ Ġfun Ġis Object (): ĠBoolean Ġ= Ġclass Metadata . isObject () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ Kotlin Metadata Element ] Ġfor Ġthe Ġgiven Ġelement Ġif Ġit Ġcontains ĠKotlin Ġmetadata , ĊĠĠĠĠĠĠĠĠ Ġ* Ġotherwise Ġthis Ġmethod Ġreturns Ġnull . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠUsually Ġthe Ġ[ element ] Ġpassed Ġmust Ġrepresent Ġa Ġclass . ĠFor Ġexample , Ġif Ġkotlin Ġmetadata Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġdesired Ġfor Ġa Ġmethod , Ġthen Ġthe Ġcontaining Ġclass Ġshould Ġbe Ġused Ġas Ġparameter . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate For ( element : ĠElement ): ĠKotlin Metadata Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġget Metadata Annotation ( element )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Class Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= Ġkind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Version Ġ= Ġmetadata Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytecode Version Ġ= Ġbytecode Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata 1 Ġ= Ġdata 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata 2 Ġ= Ġdata 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra String Ġ= Ġextra String , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= ĠpackageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Int Ġ= Ġextra Int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠSupport Ġmore Ġmetadata Ġkind Ġ( file Ġfac ade , Ġsynthetic Ġclass , Ġetc ...) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Class Metadata . read ( it ) Ġas ? ĠKotlin Class Metadata . Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( metadata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Metadata Element ( element , Ġmetadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSearch Ġfor ĠKotlin 's ĠMetadata Ġannotation Ġacross Ġthe Ġelement 's Ġhierarchy . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Metadata Annotation ( element : ĠElement ?): ĠMetadata ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getAnnotation ( Metadata :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġget Metadata Annotation ( element . enc lo sing Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }