/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 - 2 0 1 9 ĠSer ge j ĠSh af aren ka , Ġwww . half bit . de Ċ Ġ* Ċ Ġ* Ġ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 Ġmag net . processor . instances . parser Ċ Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Wildcard TypeName Ċ import Ġmag net . Classifier Ċ import Ġmag net . Instance Ċ import Ġmag net . Scope Ċ import Ġmag net . processor . Mag net Processor Env Ċ import Ġmag net . processor . common . Kotlin Method Metadata Ċ import Ġmag net . processor . common . each Attribute Of Ċ import Ġmag net . processor . common . is Of Annotation Type Ċ import Ġmag net . processor . common . throw Compilation Error Ċ import Ġmag net . processor . common . throw ValidationError Ċ import Ġmag net . processor . instances . Cardinality Ċ import Ġmag net . processor . instances . Expression Ċ import Ġmag net . processor . instances . Factory Type Ċ import Ġmag net . processor . instances . Method Parameter Ċ import Ġmag net . processor . instances . parser . Aspect Validator . Registry . VALID ATORS Ċ import Ġmag net . processor . instances . parser . Attribute Parser . Registry . PARSER S Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Variable Element Ċ import Ġjavax . lang . model . type . Type Kind Ċ Ċ const Ġval ĠF ACT ORY _ SUFFIX Ġ= Ġ" Mag net Factory " Ċ private Ġconst Ġval ĠCLASS _ NULL ABLE Ġ= Ġ". Nullable " Ċ Ċ internal Ġabstract Ġclass ĠInstance Parser < E Ġ: ĠElement >( ĊĠĠĠ Ġprivate Ġval Ġenv : ĠMag net Processor Env , ĊĠĠĠ Ġprivate Ġval Ġis Type Inheritance En forced : ĠBoolean Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscope TypeName Ġ= ĠClass Name . get ( Scope :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġlist TypeName Ġ= ĠClass Name . get ( List :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġlazy TypeName Ġ= ĠClass Name . get ( Lazy :: class . java ) ĊĊĠĠĠ Ġfun ĠE . parse (): ĠList < Factory Type > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġon Before Parsing () ĊĊĠĠĠĠĠĠĠ Ġvar Ġscope Ġ= ĠAttribute Parser . Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Type Inheritance En forced Ġ= Ġis Type Inheritance En forced , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= ĠParser Instance ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv Ġ= Ġenv ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġeach Attribute Of < Instance > Ġ{ Ġname , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPARSER S [ name ]?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġscope . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġscope . parse ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow Compilation Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unsupported Ġattribute Ġ'$ name '. " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠDo Ġyou Ġuse Ġthe Ġsame Ġversions Ġof Ġmag net Ġprocessor Ġand Ġruntime Ġlibraries ?" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġinstance Ġ= Ġscope . instance ĊĠĠĠĠĠĠĠ Ġfor Ġ( validator Ġin ĠVALID ATORS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( validator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġinstance . validate ( env ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgenerate Factories ( instance ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠE . on Before Parsing () Ġ{} ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgenerate Factories ( instance : ĠParser Instance < E >): ĠList < Factory Type > ĊĊĠĠĠ Ġprotected Ġfun Ġparse Method Parameter ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġvariable : ĠVariable Element , ĊĠĠĠĠĠĠĠ Ġmethod Meta : ĠKotlin Method Metadata ? ĊĠĠĠ Ġ): ĠMethod Parameter Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġvariable Type Ġ= Ġvariable . as Type () ĊĠĠĠĠĠĠĠ Ġif Ġ( variable Type . kind Ġ== ĠType Kind . TYPE VAR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . throw ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Constructor Ġparameter Ġ'${ variable . simple Name }' Ġis Ġspecified Ġusing Ġa Ġgeneric " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġtype Ġwhich Ġis Ġnot Ġsupported Ġby ĠMag net . ĠUse Ġa Ġnon - parameter ized Ġclass Ġor " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġinterface Ġtype Ġinstead . ĠTo Ġinject Ġcurrent Ġscope Ġinto Ġan Ġinstance ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġadd Ġ' scope : ĠScope ' Ġto Ġthe Ġconstructor Ġparameters ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparam Spec Ġ= ĠParameter Spec . get ( variable ) ĊĠĠĠĠĠĠĠ Ġval Ġparam Type Ġ= Ġparam Spec . type ĊĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= Ġparam Spec . name ĊĊĠĠĠĠĠĠĠ Ġvar Ġparam ReturnType : ĠType Name Ġ= Ġparam Type ĊĠĠĠĠĠĠĠ Ġvar Ġparam Expression : ĠExpression Ġ= ĠExpression . Scope ĊĠĠĠĠĠĠĠ Ġvar Ġparam ParameterType : ĠType Name Ġ= Ġparam Type ĊĠĠĠĠĠĠĠ Ġvar Ġparam Classifier : ĠString Ġ= ĠClass ifier . NONE ĊĠĠĠĠĠĠĠ Ġvar Ġparam Type Erase d Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġparam ParameterType . parse Param Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Name , Ġmethod Meta , Ġvariable ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĠreturnType , Ġexpression , Ġparameter Type , Ġclassifier , Ġer ased Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam ReturnType Ġ= ĠreturnType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Expression Ġ= Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam ParameterType Ġ= Ġparameter Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Classifier Ġ= Ġclassifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Type Erase d Ġ= Ġer ased ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġparam Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġparam Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġparam ReturnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type Ġ= Ġparam ParameterType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= Ġparam Classifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Erase d Ġ= Ġparam Type Erase d ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType Name . parse Param Type ( ĊĠĠĠĠĠĠĠ Ġparam Name : ĠString , ĊĠĠĠĠĠĠĠ Ġmethod Meta : ĠKotlin Method Metadata ?, ĊĠĠĠĠĠĠĠ Ġvariable : ĠVariable Element , ĊĠĠĠĠĠĠĠ Ġblock : Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType : ĠType Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression : ĠExpression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type : ĠType Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Erase d : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparam ReturnType : ĠType Name Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġvar Ġparam Expression : ĠExpression Ġ= ĠExpression . Scope ĊĠĠĠĠĠĠĠ Ġvar Ġparam ParameterType : ĠType Name Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġvar Ġparam Classifier : ĠString Ġ= ĠClass ifier . NONE ĊĠĠĠĠĠĠĠ Ġvar Ġparam Type Erase d Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope TypeName Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Expression Ġ= ĠExpression . Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ized TypeName Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( raw Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist TypeName Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( type , Ġer ased ) Ġ= Ġfirst Argument Raw Type ( variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam ParameterType Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Type Erase d Ġ= Ġer ased ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam ReturnType Ġ= Ġif Ġ( er ased ) Ġlist TypeName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠParameter ized TypeName . get ( list TypeName , Ġparam ParameterType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Expression Ġ= ĠExpression . Getter ( Cardinality . Many ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . annotations Ġ{ Ġ_, Ġclassifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Classifier Ġ= Ġclassifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlazy TypeName Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Meta Ġ== Ġnull ) Ġvariable . throw ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Lazy Ġcan Ġonly Ġbe Ġused Ġwith ĠKotlin Ġclasses ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Lazy Argument Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Name , Ġmethod Meta , Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĠreturnType , Ġcardinality , Ġparameter Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam ReturnType Ġ= ĠParameter ized TypeName . get ( lazy TypeName , ĠreturnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam ParameterType Ġ= Ġparameter Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Expression Ġ= ĠExpression . Lazy Getter ( cardinality ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . annotations Ġ{ Ġ_, Ġclassifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Classifier Ġ= Ġclassifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam ParameterType Ġ= Ġraw Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Type Erase d Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . annotations Ġ{ Ġcardinality , Ġclassifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Expression Ġ= ĠExpression . Getter ( cardinality ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Classifier Ġ= Ġclassifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . annotations Ġ{ Ġcardinality , Ġclassifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Expression Ġ= ĠExpression . Getter ( cardinality ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Classifier Ġ= Ġclassifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġblock ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam ReturnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam ParameterType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Classifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Type Erase d ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠParameter ized TypeName . parse Lazy Argument Type ( ĊĠĠĠĠĠĠĠ Ġparam Name : ĠString , ĊĠĠĠĠĠĠĠ Ġmethod Meta : ĠKotlin Method Metadata , ĊĠĠĠĠĠĠĠ Ġvariable : ĠVariable Element , ĊĠĠĠĠĠĠĠ Ġblock : Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType : ĠType Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcardinality : ĠCard inality , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type : ĠType Name ĊĠĠĠĠĠĠĠ Ġ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġargument Type Ġ= Ġtype Arguments . first (). without W ild cards ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope TypeName Ġ-> Ġvariable . throw ValidationError (" Lazy Ġcannot Ġbe Ġparame tri zed Ġwith ĠScope Ġtype .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ized TypeName Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( argument Type . raw Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlazy TypeName Ġ-> Ġvariable . throw ValidationError (" Lazy Ġcannot Ġbe Ġparame tri zed Ġwith Ġanother ĠLazy Ġtype .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist TypeName Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Meta . getType Meta ( param Name , Ġ 1 ). nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . throw ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Lazy < List > Ġmust Ġbe Ġparame tri zed Ġwith Ġnone Ġnullable ĠList Ġtype ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġlist Argument Type Ġ= Ġargument Type . type Arguments . first (). without W ild cards ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ized TypeName Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( list TypeName , Ġlist Argument Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCard inality . Many , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Argument Type . raw Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Meta . getType Meta ( param Name , Ġ 2 ). nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . throw ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Lazy < List < T >> Ġmust Ġbe Ġparame tri zed Ġwith Ġnone Ġnullable Ġtype ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( list TypeName , Ġlist Argument Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCard inality . Many , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Argument Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Meta . get Nullable Cardinality ( param Name , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type . raw Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Meta . get Nullable Cardinality ( param Name , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠKotlin Method Metadata . get Nullable Cardinality ( param Name : ĠString , Ġparam Depth : ĠInt ): ĠCard inality Ġ= ĊĠĠĠ Ġif Ġ( getType Meta ( param Name , Ġparam Depth ). nullable ) ĠCard inality . Optional ĊĠĠĠ Ġelse ĠCard inality . Single Ċ Ċ private Ġfun ĠType Name . without W ild cards ( element : ĠElement ): ĠType Name Ġ= ĊĠĠĠ Ġif Ġ( this Ġis ĠW ildcard TypeName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Bounds ( element ) ĊĠĠĠĠĠĠĠ Ġupper Bounds . first () ĊĠĠĠ Ġ} Ġelse Ġthis Ċ Ċ private Ġfun ĠW ildcard TypeName . first Upper Bounds Raw Type ( element : ĠElement ): ĠPair < TypeName , ĠBoolean > Ġ{ ĊĠĠĠ Ġcheck Bounds ( element ) ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġtype Ġ= Ġupper Bounds . first ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠParameter ized TypeName Ġ-> Ġtype . raw Type Ġto Ġtrue ĊĠĠĠĠĠĠĠ Ġis ĠW ildcard TypeName Ġ-> Ġtype . first Upper Bounds Raw Type ( element ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtype Ġto Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠW ildcard TypeName . check Bounds ( element : ĠElement ) Ġ{ ĊĠĠĠ Ġif Ġ( lower Bounds . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelement . throw ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mag net Ġsupports Ġsingle Ġupper Ġbounds Ġclass Ġparameter Ġonly ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġwhile Ġlower Ġbounds Ġclass Ġparameter Ġwas Ġfound ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( upper Bounds . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelement . throw ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mag net Ġsupports Ġsingle Ġupper Ġbounds Ġclass Ġparameter Ġonly ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġfor Ġexample ĠList < ${ upper Bounds . first () }> " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠParameter ized TypeName . first Argument Raw Type ( element : ĠElement ): ĠPair < TypeName , ĠBoolean > Ġ{ ĊĠĠĠ Ġif Ġ( type Arguments . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelement . throw ValidationError (" Mag net Ġsupports Ġtype Ġparame tri zed Ġwith Ġa Ġsingle Ġargument Ġonly .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġargument Type Ġ= Ġtype Arguments . first ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠParameter ized TypeName Ġ-> Ġargument Type . raw Type Ġto Ġtrue ĊĠĠĠĠĠĠĠ Ġis ĠW ildcard TypeName Ġ-> Ġargument Type . first Upper Bounds Raw Type ( element ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġargument Type Ġto Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġinline Ġfun ĠVariable Element . annotations ( block : Ġ( Cardinality , ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġvar Ġcardinality Ġ= ĠCard inality . Single ĊĠĠĠ Ġvar Ġclassifier Ġ= ĠClass ifier . NONE ĊĠĠĠ Ġannotation Mir rors . forEach Ġ{ Ġannotation Mirror Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( annotation Mirror . is Of Annotation Type < Classifier >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclared Classifier : ĠString ? Ġ= Ġannotation Mirror . element Values . values . first OrNull ()?. value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared Classifier ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= Ġit . remove Sur rounding (" \"", Ġ"\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Type Ġ= Ġannotation Mirror . annotation Type . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotation Type . endsWith ( CLASS _ NULL ABLE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcardinality Ġ= ĠCard inality . Optional ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġblock ( cardinality , Ġclassifier ) Ċ } Ċ