package Ġcom . air bnb . android . show k ase . processor . logging Ċ Ċ import Ġcom . air bnb . android . show k ase . annotation . Show k ase Composable Ċ import Ġcom . air bnb . android . show k ase . annotation . Show k ase Root Ċ import Ġcom . air bnb . android . show k ase . annotation . Show k ase Root Module Ċ import Ġcom . air bnb . android . show k ase . processor . exceptions . Show k ase Processor Exception Ċ import Ġcom . air bnb . android . show k ase . processor . models . kotlin Metadata Ċ import Ġkotlinx . metadata . jvm . Kotlin Class Metadata Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . type . Type Kind Ċ import Ġjavax . lang . model . type . Type Mirror Ċ import Ġjavax . lang . model . util . Elements Ċ import Ġjavax . lang . model . util . Types Ċ Ċ internal Ġclass ĠShow k ase Validator Ġ{ ĊĠĠĠ Ġ@ Suppress (" Throws Count ") ĊĠĠĠ Ġinternal Ġfun Ġvalidate Component Element ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġcomp osable Type Mirror : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġtype Utils : ĠTypes , ĊĠĠĠĠĠĠĠ Ġannotation Name : ĠString ĠĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Prefix Ġ= Ġ" Error Ġin Ġ${ element . simple Name } :" ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . kind Ġ!= ĠElement Kind . METHOD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġcomp osable Ġmethods Ġcan Ġbe Ġannotated Ġwith Ġ$ annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . annotation Mir rors . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Utils . is Same Type ( it . annotation Type , Ġcomp osable Type Mirror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġcomp osable Ġmethods Ġcan Ġbe Ġannotated Ġwith Ġ$ annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . modifiers . contains ( Modifier . PRIVATE ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠThe Ġmethods Ġannotated Ġwith Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ annotation Name Ġcan 't Ġbe Ġprivate Ġas ĠShow k ase Ġwon 't Ġbe Ġable Ġto Ġaccess Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" them Ġotherwise ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġwant Ġto Ġthrow Ġan Ġerror Ġif Ġthe Ġuser Ġused Ġthe ĠShow k ase Ġannotation . ĠFor ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ@ Preview Ġannotations Ġwith Ġparameter , Ġwe Ġsimply Ġwant Ġto Ġskip Ġthose . ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Name Ġ== ĠShow k ase Composable :: class . java . simple Name Ġ&& ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( element Ġas ĠExec utable Element ). parameters . size Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠMake Ġsure Ġthat Ġthe Ġ@ Composable Ġfunctions Ġthat Ġyou Ġannotate Ġwith " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġthe Ġ$ annotation Name Ġannotation Ġdo Ġnot Ġtake Ġin Ġany Ġparameters " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Color Element ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġannotation Name : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Prefix Ġ= Ġ" Error Ġin Ġ${ element . simple Name } :" ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . kind Ġ!= ĠElement Kind . FIELD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġ\" Color \" Ġfields Ġcan Ġbe Ġannotated Ġwith Ġ$ annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . as Type (). kind Ġ!= ĠType Kind . LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġ\" Color \" Ġfields Ġcan Ġbe Ġannotated Ġwith Ġ$ annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( vin ay . g aba ) ĠAlso Ġadd Ġthe Ġprivate Ġmodifier Ġcheck . ĠUnfortunately , Ġthe Ġjava Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġfor Ġthis Ġelement Ġadds Ġa Ġprivate Ġmodifier Ġsince Ġit 's Ġa Ġfield . ĠPot entially Ġuse ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġkotlin Metadata Ġto Ġenforce Ġthis Ġcheck . ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Typography Element ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġannotation Name : ĠString , ĊĠĠĠĠĠĠĠ Ġtext Style Type Mirror : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġtype Utils : ĠTypes ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Prefix Ġ= Ġ" Error Ġin Ġ${ element . simple Name } :" ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . kind Ġ!= ĠElement Kind . FIELD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġ\" TextStyle \" Ġfields Ġcan Ġbe Ġannotated Ġwith Ġ$ annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! type Utils . is Same Type ( element . as Type (), Ġtext Style Type Mirror ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġ\" TextStyle \" Ġfields Ġcan Ġbe Ġannotated Ġwith Ġ$ annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( vin ay . g aba ) ĠAlso Ġadd Ġthe Ġprivate Ġmodifier Ġcheck . ĠUnfortunately , Ġthe Ġjava Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġfor Ġthis Ġelement Ġadds Ġa Ġprivate Ġmodifier Ġsince Ġit 's Ġa Ġfield . ĠPot entially Ġuse ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġkotlin Metadata Ġto Ġenforce Ġthis Ġcheck . ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Show k ase Root Element ( ĊĠĠĠĠĠĠĠ Ġelement Set : ĠSet < Element >, ĊĠĠĠĠĠĠĠ Ġelement Utils : ĠElements , ĊĠĠĠĠĠĠĠ Ġtype Utils : ĠTypes ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Set . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġshow k ase Root Annotation Name Ġ= ĠShow k ase Root :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġval Ġshow k ase Root ModuleName Ġ= ĠShow k ase Root Module :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Set . size Ġ!= Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġclass Ġin Ġa Ġmodule Ġcan Ġbe Ġannotated Ġwith Ġ$ show k ase Root Annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSafe Ġto Ġdo Ġthis Ġas Ġwe 've Ġens ured Ġthat Ġthere 's Ġonly Ġone Ġelement Ġin Ġthis Ġset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġelement Set . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Prefix Ġ= Ġ" Error Ġin Ġ${ element . simple Name } :" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Class ( element , Ġshow k ase Root Annotation Name , Ġerror Prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Interface ( element , Ġelement Utils , Ġtype Utils , Ġshow k ase Root Annotation Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Prefix , Ġshow k ase Root ModuleName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequire Class ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġshow k ase Root Annotation Name : ĠString , ĊĠĠĠĠĠĠĠ Ġerror Prefix : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ!= ĠElement Kind . CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġclasses Ġcan Ġbe Ġannotated Ġwith Ġ@$ show k ase Root Annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Long Parameter List ") ĊĠĠĠ Ġprivate Ġfun Ġrequire Interface ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġelement Utils : ĠElements , ĊĠĠĠĠĠĠĠ Ġtype Utils : ĠTypes , ĊĠĠĠĠĠĠĠ Ġshow k ase Root Annotation Name : ĠString , ĊĠĠĠĠĠĠĠ Ġerror Prefix : ĠString , ĊĠĠĠĠĠĠĠ Ġshow k ase Root ModuleName : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshow k ase Root Interface Element Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Utils . getType Element ( Show k ase Root Module :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! type Utils . is Assignable ( element . as Type (), Ġshow k ase Root Interface Element . as Type ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġan Ġimplementation Ġof Ġ$ show k ase Root ModuleName Ġcan Ġbe Ġannotated Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" with Ġ@$ show k ase Root Annotation Name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate En closing Class ( ĊĠĠĠĠĠĠĠ Ġen closing ClassType Mirror : ĠType Mirror ?, ĊĠĠĠĠĠĠĠ Ġtype Utils : ĠTypes ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġen closing Class Element Ġ= Ġen closing ClassType Mirror ?. let Ġ{ Ġtype Utils . as Element ( it ) Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġkm Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( enc lo sing Class Element . kotlin Metadata () Ġas ĠKotlin Class Metadata . Class ). to Km Class () ĊĠĠĠĠĠĠĠ Ġval Ġerror Prefix Ġ= Ġ" Error Ġin Ġ${ enc lo sing Class Element . simple Name } :" ĊĠĠĠĠĠĠĠ Ġkm Class . construct ors . forEach Ġ{ Ġconstructor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constructor . value Parameters . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShow k ase Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error Prefix ĠOnly Ġclasses Ġthat Ġdon 't Ġaccept Ġany Ġconstructor Ġparameters Ġcan Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" hold Ġa Ġ@ Composable Ġfunction Ġthat 's Ġannotated Ġwith Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ ${ Show k ase Composable :: class . java . simple Name }/ @ Preview Ġannotation " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ