package Ġcom . cop per leaf . th ist le . core . renderer Ċ Ċ import Ġcom . cop per leaf . th ist le . core . parser . Th ist le Tag Factory Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ class ĠTh ist le Tags Args ( ĊĠĠĠ Ġval Ġtag Factory : ĠTh ist le Tag Factory < *, Ġ* >, ĊĠĠĠ Ġval Ġargs : ĠMap < String , ĠAny > Ċ ) Ġ{ ĊĠĠĠ Ġval Ġargs Vis ited : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġfun Ġcheck No More Args () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextra Params Ġ= Ġargs . keys Ġ- Ġargs Vis ited ĊĠĠĠĠĠĠĠ Ġcheck ( extra Params . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unknown Ġparameters Ġ'$ extra Params ' Ġfor Ġ$ tag Factory " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠParameter Type Ġ: ĠAny > Ġparameter ( ĊĠĠĠĠĠĠĠ Ġhardcoded Value : ĠParameter Type ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġname : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġ): ĠReadOnly Property < Nothing ?, ĠParameter Type > Ġ= ĠLazy Th ist le Parameter Provider < ParameterType , ĠParameter Type >( ĊĠĠĠĠĠĠĠ Ġth ist le Tags Args Ġ= Ġthis , ĊĠĠĠĠĠĠĠ Ġhardcoded Value Ġ= Ġhardcoded Value , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġcheck InputType Ġ= Ġ{ Ġit Ġis ĠParameter Type Ġ}, ĊĠĠĠĠĠĠĠ Ġinput ParameterType Class Ġ= ĠParameter Type :: class , ĊĠĠĠĠĠĠĠ Ġcheck OutputType Ġ= Ġ{ Ġtrue Ġ}, ĊĠĠĠĠĠĠĠ Ġoutput ParameterType Class Ġ= ĠParameter Type :: class , ĊĠĠĠĠĠĠĠ Ġmapper Ġ= Ġ{ Ġ_, Ġit Ġ-> Ġit Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠInput ParameterType Ġ: ĠAny , Ġre ified ĠOutput ParameterType Ġ: ĠAny > Ġparameter ( ĊĠĠĠĠĠĠĠ Ġhardcoded Value : ĠOutput ParameterType ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġname : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġno inline Ġmapper : Ġ( String , ĠInput ParameterType ) Ġ-> ĠOutput ParameterType ĊĠĠĠ Ġ): ĠReadOnly Property < Nothing ?, ĠOutput ParameterType > Ġ= ĠLazy Th ist le Parameter Provider ( ĊĠĠĠĠĠĠĠ Ġth ist le Tags Args Ġ= Ġthis , ĊĠĠĠĠĠĠĠ Ġhardcoded Value Ġ= Ġhardcoded Value , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġcheck InputType Ġ= Ġ{ Ġit Ġis ĠInput ParameterType Ġ}, ĊĠĠĠĠĠĠĠ Ġinput ParameterType Class Ġ= ĠInput ParameterType :: class , ĊĠĠĠĠĠĠĠ Ġcheck OutputType Ġ= Ġ{ Ġit Ġis ĠOutput ParameterType Ġ}, ĊĠĠĠĠĠĠĠ Ġoutput ParameterType Class Ġ= ĠOutput ParameterType :: class , ĊĠĠĠĠĠĠĠ Ġmapper Ġ= Ġmapper ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠLazy Th ist le Parameter Provider < Input ParameterType Ġ: ĠAny , ĠOutput ParameterType Ġ: ĠAny >( ĊĠĠĠ Ġprivate Ġval Ġth ist le Tags Args : ĠTh ist le Tags Args , ĊĠĠĠ Ġprivate Ġval Ġhardcoded Value : ĠOutput ParameterType ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġname : ĠString ? Ġ= Ġnull , ĊĊĠĠĠ Ġprivate Ġval Ġinput ParameterType Class : ĠK Class < Input ParameterType >, ĊĠĠĠ Ġprivate Ġval Ġcheck InputType : Ġ( Any ) Ġ-> ĠBoolean , ĊĊĠĠĠ Ġprivate Ġval Ġoutput ParameterType Class : ĠK Class < Output ParameterType >, ĊĠĠĠ Ġprivate Ġval Ġcheck OutputType : Ġ( Input ParameterType ) Ġ-> ĠBoolean , ĊĊĠĠĠ Ġprivate Ġval Ġmapper : Ġ( String , ĠInput ParameterType ) Ġ-> ĠOutput ParameterType Ċ ) Ġ: ĠReadOnly Property < Nothing ?, ĠOutput ParameterType >, ĠLazy < Output ParameterType > Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ value : ĠOutput ParameterType ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġval Ġvalue : ĠOutput ParameterType Ġget () Ġ= Ġ_ value !! ĊĊĠĠĠ Ġoverride Ġfun Ġis Initialized (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ value Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠNothing ?, Ġproperty : ĠK Property < *> ): ĠOutput ParameterType Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isInitialized ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ value Ġ= Ġwith ( th ist le Tags Args ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= Ġname Ġ?: Ġproperty . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( param Name Ġ! in Ġargs Vis ited ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ tag Factory Ġhas Ġmultiple Ġproperties Ġnamed Ġ'$ param Name ' !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs Vis ited . add ( param Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġhardcoded Value Ġis Ġprovided , Ġdo Ġnot Ġallow Ġthe Ġvalue Ġto Ġbe Ġread Ġfrom Ġthe Ġparam Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hard coded Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck (! args . containsKey ( param Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unknown Ġparameter Ġ'$ param Name ' Ġfor Ġ$ tag Factory !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhardcoded Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( args . containsKey ( param Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ tag Factory Ġis Ġmissing Ġrequired Ġvalue Ġfor Ġ'$ param Name ' !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠAny Ġ= Ġargs [ param Name ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( check InputType ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ tag Factory Ġexpects Ġ'$ param Name ' Ġto Ġbe Ġ${ input ParameterType Class . simple Name }, Ġgot Ġ$ value " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmapper ( param Name , Ġvalue Ġas ĠInput ParameterType ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( check OutputType ( result Ġas ĠInput ParameterType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ tag Factory Ġexpects Ġ'$ param Name ' Ġto Ġbe Ġ${ output ParameterType Class . simple Name }, Ġgot Ġ$ value " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun ĠTh ist le Tags Args . int ( ĊĠĠĠ Ġvalue : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġname : ĠString ? Ġ= Ġnull , Ċ ): ĠReadOnly Property < Nothing ?, ĠInt > Ġ= Ġparameter ( value , Ġname ) Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun ĠTh ist le Tags Args . double ( ĊĠĠĠ Ġvalue : ĠDouble ? Ġ= Ġnull , ĊĠĠĠ Ġname : ĠString ? Ġ= Ġnull , Ċ ): ĠReadOnly Property < Nothing ?, ĠDouble > Ġ= Ġparameter ( value , Ġname ) Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun ĠTh ist le Tags Args . string ( ĊĠĠĠ Ġvalue : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġname : ĠString ? Ġ= Ġnull , Ċ ): ĠReadOnly Property < Nothing ?, ĠString > Ġ= Ġparameter ( value , Ġname ) Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun ĠTh ist le Tags Args . boolean ( ĊĠĠĠ Ġvalue : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠ Ġname : ĠString ? Ġ= Ġnull , Ċ ): ĠReadOnly Property < Nothing ?, ĠBoolean > Ġ= Ġparameter ( value , Ġname ) Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġ< re ified ĠParameter Type Ġ: ĠAny > ĠTh ist le Tags Args . enum ( ĊĠĠĠ Ġvalue : ĠParameter Type ? Ġ= Ġnull , ĊĠĠĠ Ġname : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġcross inline Ġoptions : Ġ() Ġ-> ĠMap < String , ĠParameter Type >, Ċ ): ĠReadOnly Property < Nothing ?, ĠParameter Type > Ġ= Ġparameter < String , ĠParameter Type >( ĊĠĠĠ Ġvalue , ĊĠĠĠ Ġname Ċ ) Ġ{ Ġparameter Key , Ġstring Value Ġ-> ĊĠĠĠ Ġval Ġoptions Map Ġ= Ġoptions () ĊĠĠĠ Ġcheck ( options Map . containsKey ( stringValue )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Property Ġ'$ parameter Key ' Ġmust Ġbe Ġone Ġof Ġ${ options Map . keys } Ġfor Ġ$ tag Factory " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoptions Map [ stringValue ] !! Ċ } Ċ