/* Ċ Ġ* Ġ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 . room . processor Ċ Ċ import Ġandroidx . room . ext . Kotlin Type Names Ċ import Ġandroidx . room . ext . L Ċ import Ġandroidx . room . ext . N Ċ import Ġandroidx . room . ext . Room Cor outines Type Names Ċ import Ġandroidx . room . ext . T Ċ import Ġandroidx . room . ext . as Member Of Ċ import Ġandroidx . room . ext . find Type Element Ċ import Ġandroidx . room . ext . getS uspend Function ReturnType Ċ import Ġandroidx . room . ext . name Ċ import Ġandroidx . room . ext . require Type Mirror Ċ import Ġandroidx . room . ext . type Ċ import Ġandroidx . room . kotlin . Kotlin Metadata Element Ċ import Ġandroidx . room . parser . Parsed Query Ċ import Ġandroidx . room . solver . prepared . binder . Callable Prepared QueryResult Binder . Companion . create Prepared Binder Ċ import Ġandroidx . room . solver . prepared . binder . Prepared QueryResult Binder Ċ import Ġandroidx . room . solver . query . result . Coroutine Result Binder Ċ import Ġandroidx . room . solver . query . result . QueryResult Binder Ċ import Ġandroidx . room . solver . shortcut . binder . Callable Delete OrUpdate Method Binder . Companion . create Delete OrUpdate Binder Ċ import Ġandroidx . room . solver . shortcut . binder . Callable Insert Method Binder . Companion . create Insert Binder Ċ import Ġandroidx . room . solver . shortcut . binder . Delete OrUpdate Method Binder Ċ import Ġandroidx . room . solver . shortcut . binder . Insert Method Binder Ċ import Ġandroidx . room . solver . transaction . binder . Coroutine Transaction Method Binder Ċ import Ġandroidx . room . solver . transaction . binder . Instant Transaction Method Binder Ċ import Ġandroidx . room . solver . transaction . binder . Transaction Method Binder Ċ import Ġandroidx . room . solver . transaction . result . Transaction Method Adapter Ċ import Ġandroidx . room . vo . QueryParameter Ċ import Ġandroidx . room . vo . Shortcut QueryParameter Ċ import Ġandroidx . room . vo . Transaction Method Ċ import Ġer asure Ċ import Ġis Same Type Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Variable Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ /** Ċ Ġ* Ġ ĠDelegate Ġclass Ġwith Ġcommon Ġfunctionality Ġfor ĠDAO Ġmethod Ġprocessors . Ċ Ġ*/ Ċ abstract Ġclass ĠMethod Processor Delegate ( ĊĠĠĠ Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġval Ġcontaining : ĠDecl ared Type , ĊĠĠĠ Ġval Ġexecutable Element : ĠExec utable Element , ĊĠĠĠ Ġprotected Ġval Ġclass Metadata : ĠKotlin Metadata Element ? Ċ ) Ġ{ ĊĊĠĠĠ Ġabstract Ġfun Ġextract ReturnType (): ĠType Mirror ĊĊĠĠĠ Ġabstract Ġfun Ġextract Params (): ĠList < Variable Element > ĊĊĠĠĠ Ġfun Ġextract QueryParams (): ĠList < QueryParameter > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Parameter Names Ġ= Ġclass Metadata ?. getParameter Names ( executable Element ) ĊĠĠĠĠĠĠĠ Ġreturn Ġextract Params (). map Indexed Ġ{ Ġindex , Ġvariable Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Parameter Processor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Context Ġ= Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Ġ= Ġcontaining , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġvariable Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql Name Ġ= Ġkotlin Parameter Names ?. get OrNull ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). process () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġfind Result Binder ( returnType : ĠType Mirror , Ġquery : ĠParsed Query ): ĠQuery Result Binder ĊĊĠĠĠ Ġabstract Ġfun Ġfind Prepared Result Binder ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġquery : ĠParsed Query ĊĠĠĠ Ġ): ĠPrepared QueryResult Binder ĊĊĠĠĠ Ġabstract Ġfun Ġfind Insert Method Binder ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġparams : ĠList < Shortcut QueryParameter > ĊĠĠĠ Ġ): ĠInsert Method Binder ĊĊĠĠĠ Ġabstract Ġfun Ġfind Delete OrUpdate Method Binder ( returnType : ĠType Mirror ): ĠDelete OrUpdate Method Binder ĊĊĠĠĠ Ġabstract Ġfun Ġfind Transaction Method Binder ( ĊĠĠĠĠĠĠĠ Ġcall Type : ĠTransaction Method . Call Type ĊĠĠĠ Ġ): ĠTransaction Method Binder ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate For ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining : ĠDecl ared Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutable Element : ĠExec utable Element ĊĠĠĠĠĠĠĠ Ġ): ĠMethod Processor Delegate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Metadata Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Metadata Element . create For ( context , Ġexecutable Element . enc lo sing Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( kotlin Metadata ?. is Suspend Function ( executable Element ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Coroutine Artifact Ġ= Ġcontext . processing Env ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Type Element ( Room Cor outines Type Names . COR OUT IN ES _ ROOM . toString ()) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Coroutine Artifact ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . logger . e ( Processor Errors . MISSING _ ROOM _ COR OUT INE _ AR TI FACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS uspend Method Processor Delegate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutable Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Metadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Method Processor Delegate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutable Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Metadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDefault Ġdelegate Ġfor ĠDAO Ġmethods . Ċ Ġ*/ Ċ class ĠDefault Method Processor Delegate ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġcontaining : ĠDecl ared Type , ĊĠĠĠ Ġexecutable Element : ĠExec utable Element , ĊĠĠĠ Ġclass Metadata : ĠKotlin Metadata Element ? Ċ ) Ġ: ĠMethod Processor Delegate ( context , Ġcontaining , Ġexecutable Element , Ġclass Metadata ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġextract ReturnType (): ĠType Mirror Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġas Member Ġ= Ġexecutable Element . as Member Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . processing Env . type Utils , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġas Member . returnType ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġextract Params () Ġ= Ġexecutable Element . parameters ĊĊĠĠĠ Ġoverride Ġfun Ġfind Result Binder ( returnType : ĠType Mirror , Ġquery : ĠParsed Query ) Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . type Adapter Store . find QueryResult Binder ( returnType , Ġquery ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind Prepared Result Binder ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġquery : ĠParsed Query ĊĠĠĠ Ġ) Ġ= Ġcontext . type Adapter Store . find Prepared QueryResult Binder ( returnType , Ġquery ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind Insert Method Binder ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġparams : ĠList < Shortcut QueryParameter > ĊĠĠĠ Ġ) Ġ= Ġcontext . type Adapter Store . find Insert Method Binder ( returnType , Ġparams ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind Delete OrUpdate Method Binder ( returnType : ĠType Mirror ) Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . type Adapter Store . find Delete OrUpdate Method Binder ( returnType ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind Transaction Method Binder ( call Type : ĠTransaction Method . Call Type ) Ġ= ĊĠĠĠĠĠĠĠ ĠInstant Transaction Method Binder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Method Adapter ( executable Element . name , Ġcall Type )) Ċ } Ċ Ċ /** Ċ Ġ* ĠDelegate Ġfor ĠDAO Ġmethods Ġthat Ġare Ġa Ġsuspend Ġfunction . Ċ Ġ*/ Ċ class ĠS uspend Method Processor Delegate ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġcontaining : ĠDecl ared Type , ĊĠĠĠ Ġexecutable Element : ĠExec utable Element , ĊĠĠĠ Ġkotlin Metadata : ĠKotlin Metadata Element Ċ ) Ġ: ĠMethod Processor Delegate ( context , Ġcontaining , Ġexecutable Element , Ġkotlin Metadata ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcontinuation Param : ĠVariable Element Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes Util Ġ= Ġcontext . processing Env . type Utils ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Type Ġ= Ġcontext . processing Env ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. require Type Mirror ( Kotlin Type Names . CONT IN UATION . toString ()). er asure ( types Util ) ĊĠĠĠĠĠĠĠ Ġexecutable Element . parameters . last Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . type . er asure ( types Util ). is Same Type ( types Util , Ġcontinuation Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġextract ReturnType (): ĠType Mirror Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġas Member Ġ= Ġexecutable Element . as Member Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . processing Env . type Utils , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġas Member . getS uspend Function ReturnType () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġextract Params () Ġ= ĊĠĠĠĠĠĠĠ Ġexecutable Element . parameters . filter Not Ġ{ Ġit Ġ== Ġcontinuation Param Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Result Binder ( returnType : ĠType Mirror , Ġquery : ĠParsed Query ) Ġ= ĊĠĠĠĠĠĠĠ ĠCor outine Result Binder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arg Ġ= ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcontext . type Adapter Store . find QueryResult Adapter ( returnType , Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation ParamName Ġ= Ġcontinuation Param . name ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġfind Prepared Result Binder ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġquery : ĠParsed Query ĊĠĠĠ Ġ) Ġ= Ġcreate Prepared Binder ( ĊĠĠĠĠĠĠĠ ĠreturnType Ġ= ĠreturnType , ĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcontext . type Adapter Store . find Prepared QueryResult Adapter ( returnType , Ġquery ) ĊĠĠĠ Ġ) Ġ{ Ġcallable Impl , Ġdb Field Ġ-> ĊĠĠĠĠĠĠĠ Ġadd Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġ$ T . execute ($ N , Ġ$ L , Ġ$ L , Ġ$ N )", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Cor outines Type Names . COR OUT IN ES _ ROOM , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Field , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" true ", Ġ// Ġin Transaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Impl , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation Param . name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Insert Method Binder ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠType Mirror , ĊĠĠĠĠĠĠĠ Ġparams : ĠList < Shortcut QueryParameter > ĊĠĠĠ Ġ) Ġ= Ġcreate Insert Binder ( ĊĠĠĠĠĠĠĠ Ġtype Arg Ġ= ĠreturnType , ĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcontext . type Adapter Store . find Insert Adapter ( returnType , Ġparams ) ĊĠĠĠ Ġ) Ġ{ Ġcallable Impl , Ġdb Field Ġ-> ĊĠĠĠĠĠĠĠ Ġadd Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġ$ T . execute ($ N , Ġ$ L , Ġ$ L , Ġ$ N )", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Cor outines Type Names . COR OUT IN ES _ ROOM , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Field , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" true ", Ġ// Ġin Transaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Impl , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation Param . name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Delete OrUpdate Method Binder ( returnType : ĠType Mirror ) Ġ= ĊĠĠĠĠĠĠĠ Ġcreate Delete OrUpdate Binder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arg Ġ= ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcontext . type Adapter Store . find Delete OrUpdate Adapter ( returnType ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġcallable Impl , Ġdb Field Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġ$ T . execute ($ N , Ġ$ L , Ġ$ L , Ġ$ N )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Cor outines Type Names . COR OUT IN ES _ ROOM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" true ", Ġ// Ġin Transaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Impl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation Param . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Transaction Method Binder ( call Type : ĠTransaction Method . Call Type ) Ġ= ĊĠĠĠĠĠĠĠ ĠCor outine Transaction Method Binder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠTransaction Method Adapter ( executable Element . name , Ġcall Type ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation ParamName Ġ= Ġcontinuation Param . name ĊĠĠĠĠĠĠĠ Ġ) Ċ }