package Ġcom . jo yy . ued . android _ flutter _ annotation . compiler . processor . method Channel Ċ Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . annotation . common . Send Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . annotation . method . Flutter Method Channel Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . compiler . Printer Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . compiler . base . Base Processor Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . compiler . config . Clazz Config Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . compiler . utils . Param Type Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . compiler . utils . Processor Helper Ċ import Ġcom . jo yy . ued . android _ flutter _ annotation . compiler . utils . Type Change Utils Ċ import Ġcom . squareup . kotlin po et . ClassName Ċ import Ġcom . squareup . kotlin po et . File Spec Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Parameter Spec Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġcom . squareup . kotlin po et . Property Spec Ċ import Ġcom . squareup . kotlin po et . Type Spec Ċ import Ġcom . squareup . kotlin po et . as ClassName Ċ import Ġcom . squareup . kotlin po et . as TypeName Ċ import Ġorg . jetbrains . annotations . Nullable Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . element . Variable Element Ċ Ċ /** Ċ Ġ* Ġ@ author : ĠJ iang ĠPeng y ong Ċ Ġ* Ġ@ date : Ġ 2 0 2 1 / 8 / 3 0 Ġ 1 0 : 2 4 Ġä¸Ĭ åįĪ Ċ Ġ* Ġ@ email : Ġ 5 6 0 0 2 9 8 2 @ qq . com Ċ Ġ* Ġ@ des : ĠMethod ĠChannel Ġ åıĳéĢģ èĢħ Ċ Ġ*/ Ċ class ĠSender Processor ( ĊĠĠĠ Ġprinter : ĠPrinter , ĊĠĠĠ Ġprocessing Env : ĠProcessing Environment , ĊĠĠĠ Ġround Env : ĠRound Environment Ċ ) Ġ: ĠBase Processor ( ĊĠĠĠ Ġprinter , ĊĠĠĠ Ġprocessing Env , ĊĠĠĠ Ġround Env Ċ ) Ġ{ ĊĊĠĠĠ Ġ// Ġscope ĊĠĠĠ Ġprivate Ġval Ġscope ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ X _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ SCOPE _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠDispatch ers ĊĠĠĠ Ġprivate Ġval Ġdispatch ers ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ X _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ DISPATCH ERS _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġasync ĊĠĠĠ Ġprivate Ġval Ġasync ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ X _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ ASYNC _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠMethod Channel Result ĊĠĠĠ Ġprivate Ġval Ġresult ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ MODEL _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠSuccess Result ĊĠĠĠ Ġprivate Ġval Ġsuccess ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ MODEL _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ SUCCESS _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠError Result ĊĠĠĠ Ġprivate Ġval Ġerror ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ MODEL _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ ERROR _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠMethod Channel Result Type ĊĠĠĠ Ġprivate Ġval Ġtype ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ MODEL _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . METHOD _ RESULT _ TYPE _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠResult ĊĠĠĠ Ġprivate Ġval Ġcallback ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Flutter . METHOD _ RESULT _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Flutter . METHOD _ RESULT _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġsuspend Coroutine ĊĠĠĠ Ġprivate Ġval Ġsuspend Coroutine ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ SUS PEND _ COR OUT INE _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġresume ĊĠĠĠ Ġprivate Ġval Ġresume ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ RE SU ME _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠDeferred ĊĠĠĠ Ġprivate Ġval Ġdeferred ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . COR OUT INE _ X _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Coroutine . DEF ER RED _ NAME ĊĠĠĠ Ġ). parameter ized By ( ĊĠĠĠĠĠĠĠ Ġresult ClassName ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠMethod Channel ĊĠĠĠ Ġprivate Ġval Ġmethod Channel ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . Flutter . METHOD _ CHANNEL _ PACKAGE , ĊĠĠĠĠĠĠĠ ĠCl azz Config . Flutter . METHOD _ CHANNEL _ NAME ĊĠĠĠ Ġ). copy ( nullable Ġ= Ġtrue ) ĊĊĠĠĠ Ġ// ĠBase Sender Channel ĊĠĠĠ Ġprivate Ġval Ġbase Sender Channel ClassName Ġ= ĠClass Name ( ĊĠĠĠĠĠĠĠ ĠCl azz Config . PACKAGE . BASE _ NAME , ĊĠĠĠĠĠĠĠ ĠCl azz Config . BASE _ SEND ER _ CHANNEL _ NAME ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġhandle ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġchannel Receiver Map : ĠHashMap < String , ĠClass Name > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ æ³¨è§£ ç±» åĲį ĊĠĠĠĠĠĠĠ Ġval Ġclazz Name Ġ= Ġelement . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġ// ĠçĶŁæĪĲ ç±» åĲį ĊĠĠĠĠĠĠĠ Ġval Ġgenerate Clazz Name Ġ= Ġ"${ clazz Name } Impl " ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel Annotation Ġ= Ġelement . getAnnotation ( Flutter Method Channel :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġchannel Name Ġ= Ġchannel Annotation . channel Name ĊĊĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġelement . kind ĊĠĠĠĠĠĠĠ Ġif Ġ( kind Ġ!= ĠElement Kind . INTERFACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . error (" The Ġsender Ġof ĠMethod Ġchannel Ġmust Ġbe Ġa Ġinterface . [$ clazz Name ]") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġen closed Elements Ġ= Ġ( element Ġas ĠType Element ). enc losed Elements ĊĠĠĠĠĠĠĠ Ġval Ġfunctions Ġ= ĠArrayList < Fun Spec >() ĊĠĠĠĠĠĠĠ Ġif Ġ( enc losed Elements Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġen closed Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Ġ! is ĠExec utable Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassemble Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrelease Function Ġ= ĠFun Spec . builder (" release ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" channel Ġ= Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġfunctions . add ( release Function ) ĊĊĠĠĠĠĠĠĠ Ġval Ġengine Creator Clazz Builder Ġ= ĠType Spec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. class Builder ( generate Clazz Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Functions ( functions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. primary Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" channel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Channel ClassName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder (" channel ", Ġmethod Channel ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer (" channel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mutable ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( base Sender Channel ClassName ) ĊĊĠĠĠĠĠĠĠ ĠFile Spec . get ( Clazz Config . PACKAGE . CHANNEL _ NAME , Ġengine Creator Clazz Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( filer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassemble Function ( ĊĠĠĠĠĠĠĠ Ġmethod : ĠExec utable Element ĊĠĠĠ Ġ): ĠArrayList < Fun Spec > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsender Annotation Ġ= Ġmethod . getAnnotation ( Send :: class . java ) ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġmethod . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmethod . parameters ĊĊĠĠĠĠĠĠĠ Ġ// Ġèİ·åıĸ åıĤæķ° ç±»åŀĭ ĊĠĠĠĠĠĠĠ Ġval Ġparam Type Ġ= ĠProcessor Helper . check Param ( printer , Ġmethod , Ġparameters ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç»Ħ è£ħ åıĤæķ° ç±»åŀĭ ĊĠĠĠĠĠĠĠ Ġval Ġparameter List Ġ= ĠArrayList < Parameter Spec >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġparameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġparameter . as Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= ĠType Change Utils . change ( printer , ĠtypeName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnullable Annotation Ġ= Ġparameter . getAnnotation ( Nullable :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nullable Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . copy ( nullable Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . simple Name . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsender Name Ġ= Ġsender Annotation ?. name Ġ?: ĠmethodName ĊĊĠĠĠĠĠĠĠ Ġ// ĠåĪĽå»º æĸ¹æ³ķ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Fun Spec >() ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġcreate Method ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg MethodName Ġ= ĠmethodName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender Name Ġ= Ġsender Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Type Ġ= Ġparam Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Parameters Ġ= Ġparameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter List Ġ= Ġparameter List ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlist . add ( function . build ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĽå»º åĽŀè°ĥ ĊĠĠĠĠ Ġ* Ġ@ param Ġfunction ĠéľĢè¦ģ æ·»åĬł åĽŀè°ĥ çļĦæĸ¹æ³ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Callback ( function : ĠFun Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcallback Ġ-> Ġsuccess ĊĠĠĠĠĠĠĠ Ġfunction . begin Control Flow (" override Ġfun Ġsuccess ( result : ĠAny ?) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" it .% T (", Ġresume ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" Ġ Ġ% T (", Ġresult ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠ Ġresult Type Ġ= Ġ% T . SUCCESS ,", Ġtype ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠ Ġsuccess Result Ġ= Ġ% T ( result )", Ġsuccess ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" Ġ Ġ) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĊĠĠĠĠĠĠĠ Ġ// Ġcallback Ġ-> Ġerror ĊĠĠĠĠĠĠĠ Ġfunction . begin Control Flow (" override Ġfun Ġerror ( errorCode : ĠString ?, ĠerrorMessage : ĠString ?, Ġerror Details : ĠAny ?) Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" it .% T (", Ġresume ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" Ġ Ġ% T (", Ġresult ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠ Ġresult Type Ġ= Ġ% T . ERROR ,", Ġtype ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠ Ġerror Result Ġ= Ġ% T (", Ġerror ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠĠĠ ĠerrorCode Ġ= ĠerrorCode , ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠĠĠ ĠerrorMessage Ġ= ĠerrorMessage , ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠĠĠ Ġerror Details Ġ= Ġerror Details ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠ Ġ) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" Ġ Ġ) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĊĠĠĠĠĠĠĠ Ġ// Ġcallback Ġ-> Ġnot Implemented ĊĠĠĠĠĠĠĠ Ġfunction . begin Control Flow (" override Ġfun Ġnot Implemented () Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" it .% T (", Ġresume ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" Ġ Ġ% T (", Ġresult ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" ĠĠĠ Ġresult Type Ġ= Ġ% T . NOT _ IMPLEMENTED ", Ġtype ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" Ġ Ġ) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĽå»º æĸ¹æ³ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Method ( ĊĠĠĠĠĠĠĠ Ġorg MethodName : ĠString , ĊĠĠĠĠĠĠĠ Ġsender Name : ĠString , ĊĠĠĠĠĠĠĠ Ġparam Type : ĠParam Type , ĊĠĠĠĠĠĠĠ Ġmethod Parameters : ĠList < Variable Element >, ĊĠĠĠĠĠĠĠ Ġparameter List : ĠList < Parameter Spec > ĊĠĠĠ Ġ): ĠFun Spec . Builder Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠFun Spec . builder ( org MethodName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( deferred ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( parameter List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġresult Ġ= Ġ% T (% T . Main ). % T ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ers ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync ClassName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠåĪĽå»º ĠHashMap Ġ ç±»åŀĭ ĠHashMap < String , ĠAny ?> ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠHashMap :: class . as ClassName (). parameter ized By ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . as TypeName (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAny :: class . as ClassName (). copy ( nullable Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( param Type Ġ== ĠParam Type . MAP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . add Statement (" val Ġparams Ġ= Ġ% T ()", Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġmethod Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Name Ġ= Ġparameter . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . add Statement (" params [% S ] Ġ= Ġ$ parameter Name ", Ġparameter Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% T <% T >", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Coroutine ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ClassName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. begin Control Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġcallback Ġ= Ġobject Ġ: Ġ% T Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ClassName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcreate Callback ( function ) ĊĠĠĠĠĠĠĠ Ġfunction . end Control Flow () ĊĊĠĠĠĠĠĠĠ Ġvar Ġlog Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġwhen Ġ( param Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParam Type . MAP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" channel ?. invoke Method (% S , Ġparams , Ġcallback )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParam Type . ORIGIN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmethod Parameters . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ<= Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" \"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ== Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Parameters [ 0 ]. simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= Ġ" You Ġuse Ġ@ Param Ġannotation Ġon Ġmulti Ġparameters Ġfunction ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġcaused Ġonly Ġthe Ġfirst Ġparameter Ġwill Ġbe Ġused ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . warning ("$ log Ġ[ Ġ$ org MethodName Ġ] Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Parameters [ 0 ]. simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" channel ?. invoke Method (% S , Ġ$ param Name , Ġcallback )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( log . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% T . e (% S , Ġ% S )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCl azz Config . Android . ANDROID _ UTIL _ PACKAGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCl azz Config . Android . ANDROID _ LOG _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCl azz Config . PROJECT _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( statement , Ġsender Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġresult ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction ĊĠĠĠ Ġ} Ċ }