/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġ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 . compose . plugins . idea . conversion Ċ Ċ import Ġorg . jetbrains . kotlin . j 2 k . ast . Expression Ċ import Ġorg . jetbrains . kotlin . j 2 k . ast . Identifier Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern Ċ Ċ internal Ġfun Ġconversion ( builder : ĠConversion Configuration . () Ġ-> ĠUnit ): ĠConversion Configuration Ġ{ ĊĠĠĠ Ġreturn ĠConversion Configuration (). apply ( builder ) Ċ } Ċ Ċ @ Dsl Marker Ċ annotation Ġclass ĠConversion Dsl Ċ Ċ @ Conversion Dsl Ċ class ĠConversion Configuration Ġ{ ĊĠĠĠ Ġval Ġclass Conversions Ġ= Ġarray ListOf < Class Conversion >() ĊĊĠĠĠ Ġfun Ġany Class ( builder : ĠAny Class Conversion . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Conversions . add ( Any Class Conversion (). apply ( builder )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠString . invoke ( builder : ĠExact Class Conversion . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Conversions . add ( Exact Class Conversion ( this ). apply ( builder )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Conversion Dsl Ċ sealed Ġclass ĠClass Conversion Ġ{ ĊĠĠĠ Ġval Ġattribute Conversions Ġ= Ġarray ListOf < Attribute Conversion >() ĊĊĠĠĠ Ġabstract Ġfun Ġmatches Any ( class Names : ĠSet < String >): ĠBoolean ĊĊĠĠĠ Ġfun Ġany Attribute ( builder : ĠAny Attribute Conversion . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattribute Conversions . add ( Any Attribute Conversion (). apply ( builder )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġany Of ( var arg Ġattributes : ĠString , Ġbuilder : ĠExact XmlAttribute Conversion . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattributes . forEach Ġ{ Ġattribute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Conversions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExact XmlAttribute Conversion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply ( builder )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠString . invoke ( builder : ĠExact XmlAttribute Conversion . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattribute Conversions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExact XmlAttribute Conversion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply ( builder )) ĊĠĠĠ Ġ} Ċ } Ċ class ĠAny Class Conversion Ġ: ĠClass Conversion () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches Any ( class Names : ĠSet < String >): ĠBoolean Ġ= Ġtrue Ċ } Ċ class ĠExact Class Conversion ( val ĠclassName : ĠString ) Ġ: ĠClass Conversion () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches Any ( class Names : ĠSet < String >): ĠBoolean Ġ= ĠclassNames . contains ( className ) Ċ } Ċ Ċ interface ĠConversion Context Ġ{ ĊĠĠĠ Ġ// ĠTODO ( j de me ul ena ere ): ĠAdd Ġtag Class Ġhere Ġif Ġa Ġconverter Ġneeds Ġit . ĊĠĠĠ Ġval Ġxml Name : ĠString ĊĠĠĠ Ġval Ġxml Value : ĠString Ċ } Ċ Ċ sealed Ġclass ĠConversion Result Ġ{ ĊĠĠĠ Ġclass ĠSuccess ( ĊĠĠĠĠĠĠĠ Ġval Ġexpression : ĠExpression , ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Type : ĠF q Name ĊĠĠĠ Ġ) Ġ: ĠConversion Result () ĊĊĠĠĠ Ġobject ĠFailure Ġ: ĠConversion Result () Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > Ġsuccess ( expression : ĠExpression ) Ġ= ĊĠĠĠ ĠConversion Result . Success ( ĊĠĠĠĠĠĠĠ Ġexpression , ĊĠĠĠĠĠĠĠ ĠF q Name ( T :: class . qualified Name !! ) ĊĠĠĠ Ġ) Ċ fun Ġsuccess ( expression : ĠExpression , Ġkotlin Type : ĠF q Name ) Ġ= ĊĠĠĠ ĠConversion Result . Success ( expression , Ġkotlin Type ) Ċ fun Ġfailure () Ġ= ĠConversion Result . Failure Ċ Ċ type alias ĠConversion Ġ= ĠConversion Context . () Ġ-> ĠConversion Result Ċ type alias ĠConversion With Matcher Ġ= ĠConversion Context .( Matcher ) Ġ-> ĠConversion Result Ċ Ċ @ Conversion Dsl Ċ sealed Ġclass ĠAttribute Conversion Ġ{ ĊĠĠĠ Ġval Ġvalue Conversions Ġ= Ġarray ListOf < Value Conversion >() ĊĊĠĠĠ Ġabstract Ġfun Ġmatches ( xml Name : ĠString ): ĠBoolean ĊĊĠĠĠ Ġfun Ġany Value ( conversion : ĠConversion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Conversions . add ( Any Value Conversion ( conversion )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġany Of ( var arg Ġvalues : ĠString , Ġconversion : ĠConversion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Conversions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExact Value Conversion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠString . invoke ( conversion : ĠConversion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Conversions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExact Value Conversion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpattern ( pattern : ĠString , Ġconversion : ĠConversion With Matcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Conversions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPattern Value Conversion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ class ĠAny Attribute Conversion Ġ: ĠAttribute Conversion () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches ( xml Name : ĠString ) Ġ= Ġtrue Ċ } Ċ class ĠExact XmlAttribute Conversion ( private Ġval Ġattribute Name : ĠString ) Ġ: ĠAttribute Conversion () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches ( xml Name : ĠString ): ĠBoolean Ġ= Ġthis . attribute Name Ġ== Ġxml Name Ċ } Ċ Ċ abstract Ġclass ĠValue Conversion Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġmatches ( attribute Value : ĠString ): ĠBoolean ĊĊĠĠĠ Ġabstract Ġfun Ġconvert ( context : ĠConversion Context ): ĠConversion Result Ċ } Ċ Ċ abstract Ġclass ĠBase Value Conversion ( private Ġval Ġconversion : ĠConversion ) Ġ: ĠValue Conversion () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġconvert ( context : ĠConversion Context ): ĠConversion Result Ġ= Ġconversion ( context ) Ċ } Ċ Ċ class ĠAny Value Conversion ( conversion : ĠConversion ) Ġ: ĠBase Value Conversion ( conversion ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches ( attribute Value : ĠString ): ĠBoolean Ġ= Ġtrue Ċ } Ċ class ĠExact Value Conversion ( ĊĠĠĠ Ġprivate Ġval Ġvalue : ĠString , ĊĠĠĠ Ġconversion : ĠConversion Ċ ) Ġ: ĠBase Value Conversion ( conversion ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches ( attribute Value : ĠString ): ĠBoolean Ġ= Ġthis . value Ġ== Ġattribute Value Ċ } Ċ Ċ class ĠPattern Value Conversion ( ĊĠĠĠ Ġpattern : ĠString , ĊĠĠĠ Ġprivate Ġval Ġconversion : ĠConversion With Matcher Ċ ) Ġ: ĠValue Conversion () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpattern Ġ= ĠPattern . compile ( pattern ) ĊĠĠĠ Ġoverride Ġfun Ġmatches ( attribute Value : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġpattern . matcher ( attribute Value ). matches () ĊĊĠĠĠ Ġoverride Ġfun Ġconvert ( context : ĠConversion Context ): ĠConversion Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . conversion ( pattern . matcher ( context . xml Value ). also Ġ{ Ġassert ( it . matches ()) Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠString . as Identifier ( import : ĠF q Name ? Ġ= Ġnull ) Ġ= ĊĠĠĠ ĠIdentifier ( this , Ġis Nullable Ġ= Ġfalse , Ġimports Ġ= Ġimport ?. let (:: listOf ) Ġ?: Ġempty List ()) Ċ internal Ġfun ĠString . as Identifier ( import : ĠString ): ĠIdentifier Ġ= ĊĠĠĠ ĠIdentifier ( this , Ġis Nullable Ġ= Ġfalse , Ġimports Ġ= ĠlistOf ( Fq Name ( import ))) Ċ