/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . jetbrains . kotlin x . serialization . compiler . backend . common Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Code gen Util . get Member To Generate Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Pure Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . synt het ics . find Class Descriptor Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . fq Name Unsafe Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . get Descriptors Filtered Ċ import Ġorg . jetbrains . kotlin x . serialization . compiler . resolve .* Ċ import Ġorg . jetbrains . kotlin x . serialization . compiler . resolve . K Serializer Descriptor Resolver . create Typed Serializer Constructor Descriptor Ċ Ċ abstract Ġclass ĠSerializer Code gen ( ĊĠĠĠ Ġprotected Ġval Ġserializer Descriptor : ĠClass Descriptor , ĊĠĠĠ Ġbinding Context : ĠBinding Context Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠĠĠ Ġprotected Ġval Ġserializer Descriptor : ĠClass Descriptor Ġ= Ġdeclaration . find Class Descriptor ( binding Context ) ĊĠĠĠ Ġprotected Ġval Ġserial izable Descriptor : ĠClass Descriptor Ġ= Ġget Serializable Class Descriptor By Serializer ( serializer Descriptor ) !! ĊĠĠĠ Ġprotected Ġval Ġserial Name : ĠString Ġ= Ġserial izable Descriptor . annotations . serial Name Value Ġ?: Ġserial izable Descriptor . fq Name Unsafe . asString () ĊĠĠĠ Ġprotected Ġval Ġproperties Ġ= ĠSerializable Properties ( serial izable Descriptor , Ġbinding Context ) ĊĠĠĠ Ġprotected Ġval Ġordered Properties Ġ= Ġproperties . serial izable Properties ĊĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( properties . is Ex tern ally Serializable ) Ġ{ Ġ" Class Ġ${ serial izable Descriptor . name } Ġis Ġnot Ġextern ally Ġserial izable " Ġ} ĊĠĠĠĠĠĠĠ Ġgenerate Serial Desc () ĊĠĠĠĠĠĠĠ Ġval Ġprop Ġ= Ġgenerate Serializable Class Property IfNeeded () ĊĠĠĠĠĠĠĠ Ġval Ġsave Ġ= Ġgenerate Save IfNeeded () ĊĠĠĠĠĠĠĠ Ġval Ġload Ġ= Ġgenerate Load IfNeeded () Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( save Ġ|| Ġload Ġ|| Ġprop ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Serial Desc () ĊĠĠĠĠĠĠĠ Ġif Ġ( serial izable Descriptor . declared Type Parameters . isNotEmpty () Ġ&& Ġtyped Serializer Constructor Not Declared ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Generic Fields And Constructor ( create Typed Serializer Constructor Descriptor ( serializer Descriptor , Ġserial izable Descriptor )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġchecks Ġif Ġuser Ġdidn 't Ġdeclared Ġconstructor Ġ( K Serializer < T 0 >, ĠK Serializer < T 1 > ...) Ġon Ġa ĠK Serializer < T < T 0 , ĠT 1 ... >> ĊĠĠĠ Ġprivate Ġfun Ġtyped Serializer Constructor Not Declared (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserial izable Implementation Type Arguments Ġ= Ġextract K Serializer Argument From Implementation ( serializer Descriptor )?. arguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" Serializer Ġdoes Ġnot Ġimplement ĠK Serializer ?? ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Params Count Ġ= Ġserial izable Implementation Type Arguments . size ĊĠĠĠĠĠĠĠ Ġif Ġ( type Params Count Ġ== Ġ 0 ) Ġreturn Ġfalse Ġ// don 't Ġneed Ġit ĊĠĠĠĠĠĠĠ Ġval Ġct ors Ġ= Ġserializer Descriptor . construct ors ĊĠĠĠĠĠĠĠ Ġval Ġfound Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġct ors . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Parameters . size Ġ== Ġtype Params Count Ġ&& Ġit . value Parameters . fold Indexed ( false ) Ġ{ Ġindex , Ġflag , Ġparameter Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġparameter Descriptor . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ|| Ġ( is K Serializer ( type ) Ġ&& Ġtype . arguments . first () Ġ== Ġserial izable Implementation Type Arguments [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ! found ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġgenerated Serial Desc Property Descriptor Ġ= ĠgetProperty To Generate ( ĊĠĠĠĠĠĠĠ Ġserializer Descriptor , ĠSerial Entity Names . SERIAL _ DESC _ FIELD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ Ġserializer Descriptor :: check Serializable Class Property Result ) ĊĠĠĠ Ġprotected Ġval Ġany Serial Desc Property Ġ= ĠgetProperty ( ĊĠĠĠĠĠĠĠ Ġserializer Descriptor , ĠSerial Entity Names . SERIAL _ DESC _ FIELD , ĊĠĠĠĠĠĠĠ Ġserializer Descriptor :: check Serializable Class Property Result ĊĠĠĠ Ġ) Ġ{ Ġtrue Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgenerate Serial Desc () ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgenerate Generic Fields And Constructor ( typed Constructor Descriptor : ĠConstructor Descriptor ) ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgenerate Serializable Class Property ( property : ĠProperty Descriptor ) ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgenerate Save ( function : ĠFunction Descriptor ) ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgenerate Load ( function : ĠFunction Descriptor ) ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Serializable Class Property IfNeeded (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġgenerated Serial Desc Property Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġgenerate Serializable Class Property ( property ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Save IfNeeded (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġget Member To Generate ( serializer Descriptor , ĠSerial Entity Names . SAVE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Descriptor :: check Save MethodResult , Ġserializer Descriptor :: check Save Method Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġgenerate Save ( function ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Load IfNeeded (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġget Member To Generate ( serializer Descriptor , ĠSerial Entity Names . LOAD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Descriptor :: check Load MethodResult , Ġserializer Descriptor :: check Load Method Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġgenerate Load ( function ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetProperty To Generate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Descriptor : ĠClass Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ReturnType Ok : Ġ( Property Descriptor ) Ġ-> ĠBoolean ĊĠĠĠ Ġ): ĠProperty Descriptor ? Ġ= ĠgetProperty ( ĊĠĠĠĠĠĠĠ Ġclass Descriptor , ĊĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠ Ġis ReturnType Ok ĊĠĠĠ Ġ) Ġ{ Ġkind Ġ-> ĊĠĠĠĠĠĠĠ Ġkind Ġ== ĠCallable Member Descriptor . Kind . SYN TH ES IZED Ġ|| Ġkind Ġ== ĠCallable Member Descriptor . Kind . FA KE _ OVERRIDE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetProperty ( ĊĠĠĠĠĠĠĠ Ġclass Descriptor : ĠClass Descriptor , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġis ReturnType Ok : Ġ( Property Descriptor ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠ Ġis Kind Ok : Ġ( Callable Member Descriptor . Kind ) Ġ-> ĠBoolean ĊĠĠĠ Ġ): ĠProperty Descriptor ? Ġ= Ġclass Descriptor . un subst it uted Member Scope . get Cont ributed Variables ( ĊĠĠĠĠĠĠĠ ĠName . identifier ( name ), ĊĠĠĠĠĠĠĠ ĠNo Lookup Location . FROM _ BACKEND ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. single OrNull Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Kind Ok ( property . kind ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . modal ity Ġ!= ĠMod ality . FINAL Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . returnType Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ReturnType Ok ( property ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠClass Descriptor . get Func Desc ( func Name : ĠString ): ĠSequence < Function Descriptor > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun subst it uted Member Scope . get Descriptors Filtered Ġ{ Ġit Ġ== ĠName . identifier ( func Name ) Ġ}. as Sequence (). filter Is Instance < Function Descriptor >() Ċ } Ċ