/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġcom . google . api . grpc . k apt . generator Ċ Ċ import Ġcom . google . api . grpc . k apt . Grpc Client Ċ import Ġcom . google . api . grpc . k apt . Grpc Server Ċ import Ġcom . google . api . grpc . k apt . generator . proto . Proto Interface Generator Ċ import Ġcom . squareup . kotlin po et . Code Block Ċ 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 . Lambda TypeName Ċ 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 Alias Spec Ċ import Ġcom . squareup . kotlin po et . TypeName Ċ import Ġcom . squareup . kotlin po et . Type Spec Ċ import Ġcom . squareup . kotlin po et . Type Variable Name Ċ import Ġcom . squareup . kotlin po et . as ClassName Ċ import Ġcom . squareup . kotlin po et . as TypeName Ċ import Ġio . grpc . Bind able Service Ċ import Ġio . grpc . MethodDescriptor Ċ import Ġio . grpc . Server Ċ import Ġio . grpc . Server Builder Ċ import Ġio . grpc . Server Call Handler Ċ import Ġio . grpc . Server Service Definition Ċ import Ġio . grpc . Service Descriptor Ċ import Ġio . grpc . stub . Server Calls Ċ import Ġio . grpc . stub . Stream Observer Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . lang . model . element . Element Ċ Ċ /** Ċ Ġ* ĠGenerates Ġa ĠgRPC Ġ[ io . grpc . Bind able Service ] Ġfrom Ġan Ġinterface Ġannotated Ġwith Ġ[ Grpc Server ]. Ċ Ġ*/ Ċ internal Ġclass ĠServer Generator ( ĊĠĠĠ Ġenvironment : ĠProcessing Environment , ĊĠĠĠ Ġprivate Ġval Ġclient Elements : ĠCollection < Element > Ċ ) Ġ: ĠGenerator < List < File Spec >>( environment ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġproto Generator Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠProto Interface Generator ( environment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( element : ĠElement ): ĠList < File Spec > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġmutable ListOf < File Spec >() ĊĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġelement . getAnnotation ( Grpc Server :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠCode Generation Exception (" Unsupported Ġelement : Ġ$ element ") ĊĊĠĠĠĠĠĠĠ Ġval Ġinterface Type Ġ= Ġelement . as Generated Interface Type () ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġmetadata Ġrequired Ġfor Ġgeneration ĊĠĠĠĠĠĠĠ Ġval Ġk metadata Ġ= Ġelement . as Kotlin Metadata () ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= Ġannotation . extract TypeInfo ( element , Ġannotation . suffix ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġmarshaller Ġto Ġuse ĊĠĠĠĠĠĠĠ Ġval Ġmarshaller Type Ġ= Ġannotation . as Marshaller Type () ĊĊĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġthe Ġfull Ġservice Ġname Ġ( use Ġthe Ġimplemented Ġinterfaces , Ġif Ġavailable ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Interface TypeInfo Ġ= ĠgetClient Annotation ( element ) ĊĠĠĠĠĠĠĠ Ġval Ġfull ServiceName Ġ= Ġclient Interface TypeInfo ?. fullName Ġ?: Ġtype Info . fullName ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġclient Interface TypeInfo ?. source Ġ?: Ġtype Info . source ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠFile Spec . builder ( type Info . type . packageName , Ġtype Info . type . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" as Grpc Service ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder (" coroutine Scope ", ĠCor outine Scope :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. defaultValue ("% T ", ĠGlobal Scope :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receiver ( interface Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Bind able Service :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġ% T ( this , Ġcoroutine Scope )", Ġtype Info . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add K doc ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Create Ġa Ġnew Ġservice Ġthat Ġcan Ġbe Ġbound Ġto Ġa ĠgRPC Ġserver . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Server Ġmethods Ġare Ġlaunched Ġin Ġthe Ġ[ coroutine Scope ], Ġwhich Ġis Ġthe Ġ[% T ] Ġby Ġdefault . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope :: class . as TypeName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" as Grpc Server ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" port ", ĠInt :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder (" coroutine Scope ", ĠCor outine Scope :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. defaultValue ("% T ", ĠGlobal Scope :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receiver ( interface Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Server :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| return Ġ% T . for Port ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ. add Service ( this . as Grpc Service ( coroutine Scope )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Builder :: class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add K doc ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Create Ġa Ġnew ĠgRPC Ġserver Ġon Ġthe Ġgiven Ġ[ port ] Ġrunning Ġthe Ġ[% T ] Ġservice . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Server Ġmethods Ġare Ġlaunched Ġin Ġthe Ġ[ coroutine Scope ], Ġwhich Ġis Ġthe Ġ[% T ] Ġby Ġdefault . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterface Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope :: class . as TypeName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" as Grpc Server ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . SUS PEND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" port ", ĠInt :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" block ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLambda TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= ĠCor outine Scope :: class . as ClassName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= ĠUnit :: class . as TypeName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). copy ( sus pending Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receiver ( interface Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| coroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġval Ġserver Ġ= Ġthis @ as Grpc Server . as Grpc Server ( port , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġserver . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġserver . shutdown (). await Termination () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add K doc ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Create Ġa Ġnew ĠgRPC Ġserver Ġand Ġexecute Ġthe Ġgiven Ġblock Ġbefore Ġshut ting Ġdown . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| This Ġmethod Ġis Ġintended Ġfor Ġtesting Ġand Ġexamples . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Alias ( method ListType Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Alias ( method Binding Type Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( method Binding Fun ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Spec . class Builder ( type Info . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( Bind able Service :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. primary Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" implementation ", Ġinterface Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" coroutine Scope ", ĠCor outine Scope :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder (" implementation ", Ġinterface Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer (" implementation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Spec . builder (" name ", ĠString :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ("% S ", Ġfull ServiceName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . filter Rpc Methods (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk metadata . describe Element ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. as MethodDescriptor ( marshaller Type , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addProperty ( generate Service Descriptor ( provider )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addProperty ( generate Service Definition ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" bind Service ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Server Service Definition :: class . as TypeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġservice Definition ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Import (" kotlin x . coroutines ", Ġ" launch ", Ġ" run Blocking ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Import (" kotlin x . coroutines ", Ġ" coroutine Scope ") ĊĊĠĠĠĠĠĠĠ Ġval Ġschema Descriptor Type Ġ= Ġprovider ?. getSchema Descriptor Type () ĊĠĠĠĠĠĠĠ Ġif Ġ( schema Descriptor Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . add Type ( schema Descriptor Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfiles Ġ+= Ġserver . build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfiles ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Kotlin MethodInfo >. as MethodDescriptor ( ĊĠĠĠĠĠĠĠ Ġmarshaller Type : ĠType Name , ĊĠĠĠĠĠĠĠ Ġprovider : ĠSchema Descriptor Provider ? ĊĠĠĠ Ġ): ĠProperty Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethods Initial izers Ġ= Ġthis . map Ġ{ Ġit . as MethodDescriptor ( marshaller Type , Ġprovider ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠProperty Spec . builder (" methods ", Ġmethod ListType Alias . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ( with ( Code Block . builder ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd (" listOf (\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( idx , Ġcode ) Ġin Ġmethods Initial izers . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ== Ġmethods Initial izers . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("% L ", Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("% L ,", Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠKotlin MethodInfo . as MethodDescriptor ( ĊĠĠĠĠĠĠĠ Ġmarshaller Type : ĠType Name , ĊĠĠĠĠĠĠĠ Ġprovider : ĠSchema Descriptor Provider ? ĊĠĠĠ Ġ): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Call Ġ= Ġwith ( Code Block . builder ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rpc . type Ġ== ĠMethod Descriptor . MethodType . SERVER _ STREAM ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| % T . async Server Streaming Call Ġ{ Ġrequest : Ġ% T , Ġresponse Observer : Ġ% T Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( data Ġin Ġimplementation .% L ( request )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . onNext ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} Ġcatch ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . onError ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Calls :: class . as ClassName (), Ġrpc . input Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Observer :: class . as ClassName (). parameter ized By ( rpc . output Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rpc . type Ġ== ĠMethod Descriptor . MethodType . CLIENT _ STREAM ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| % T . async Client Streaming Call Ġ{ Ġresponse Observer : Ġ% T Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġval Ġrequest Channel : Ġ% T Ġ= ĠChannel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġval Ġrequest Observer Ġ= Ġobject Ġ: Ġ% T Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( value : Ġ% T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġrequest Channel . send ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Channel . close ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Completed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Channel . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . onNext ( implementation .% L ( request Channel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġrequest Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Calls :: class . as ClassName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Observer :: class . as ClassName (). parameter ized By ( rpc . output Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannel :: class . as ClassName (). parameter ized By ( rpc . input Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Observer :: class . as ClassName (). parameter ized By ( rpc . input Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpc . input Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rpc . type Ġ== ĠMethod Descriptor . MethodType . B IDI _ STREAM ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| % T . async B idi Streaming Call Ġ{ Ġresponse Observer : Ġ% T Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġval Ġrequest Channel : Ġ% T Ġ= ĠChannel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġval Ġrequest Observer Ġ= Ġobject Ġ: Ġ% T Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( value : Ġ% T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġrequest Channel . send ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Channel . close ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Completed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Channel . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( data Ġin Ġimplementation .% L ( request Channel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . onNext ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} Ġcatch ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . onError ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġrequest Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Calls :: class . as ClassName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Observer :: class . as ClassName (). parameter ized By ( rpc . output Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannel :: class . as ClassName (). parameter ized By ( rpc . input Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Observer :: class . as ClassName (). parameter ized By ( rpc . input Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpc . input Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ĠMethod Descriptor . MethodType . UNARY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| % T . async Unary Call Ġ{ Ġrequest : Ġ% T , Ġresponse Observer : Ġ% T Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . onNext ( implementation .% L ( request )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} Ġcatch ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observer . onError ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Calls :: class . as ClassName (), Ġrpc . input Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Observer :: class . as ClassName (). parameter ized By ( rpc . output Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun indent () ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| method Binding ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ% T . newBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ% T . of (% T :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ% T . of (% T :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġset Full MethodName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Descriptor . generate Full MethodName ( name , Ġ% S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġset Type ( MethodDescriptor . MethodType .% L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġset Schema Descriptor (% L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ% L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Descriptor :: class . as TypeName (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmarshaller Type , Ġrpc . input Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmarshaller Type , Ġrpc . output Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrpc . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrpc . type . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider ?. getSchema Descriptor For ( rpc . name ) Ġ?: Ġ" null ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Call ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Service Descriptor ( provider : ĠSchema Descriptor Provider ?) Ġ= ĊĠĠĠĠĠĠĠ ĠProperty Spec . builder (" service Descriptor ", ĠService Descriptor :: class . as TypeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| with ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ% T . newBuilder ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġfor Ġ(( method , Ġ_) Ġin Ġmethods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġadd Method ( method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġset Schema Descriptor (% L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Descriptor :: class . as TypeName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider ?. getSchema Descriptor For () Ġ?: Ġ" null " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Service Definition () Ġ= ĊĠĠĠĠĠĠĠ ĠProperty Spec . builder (" service Definition ", ĠServer Service Definition :: class . as TypeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| with ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ% T . builder ( service Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġfor Ġ(( method , Ġhandler ) Ġin Ġmethods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġadd Method ( method Ġas Ġ% T , Ġhandler Ġas Ġ% T ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Service Definition :: class . as TypeName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Descriptor :: class . as ClassName (). parameter ized By ( Any :: class . as TypeName (), ĠAny :: class . as TypeName ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Call Handler :: class . as ClassName (). parameter ized By ( Any :: class . as TypeName (), ĠAny :: class . as TypeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ// Ġget Ġthe Ġmatching Ġ@ Grpc Client Ġannotation Ġfor Ġthis Ġelement Ġ( if Ġit Ġexists ) ĊĠĠĠ Ġprivate Ġfun ĠgetClient Annotation ( element : ĠElement ): ĠAnnot ated TypeInfo ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( super Type Ġin Ġenvironment . type Utils . direct Sup ert ypes ( element . as Type ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Interface Ġ= Ġclient Elements . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . type Utils . is Same Type ( it . as Type (), Ġsuper Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Annotation Ġ= Ġclient Interface ?. getAnnotation ( Grpc Client :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( client Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclient Annotation . extract TypeInfo ( client Interface , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠGr pc Client . extract TypeInfo ( ĊĠĠĠĠĠĠĠ Ġelement : ĠElement , ĊĠĠĠĠĠĠĠ Ġsuffix : ĠString ĊĠĠĠ Ġ): ĠAnnot ated TypeInfo Ġ= Ġextract TypeInfo ( element , Ġsuffix , ĠlistOf ( proto Generator )) Ċ } Ċ Ċ // Ġvarious Ġtype Ġaliases Ġand Ġhelp Ġfunctions Ġto Ġsimplify Ġthe Ġgenerated Ġcode Ċ Ċ private Ġval Ġmethod Binding Type Alias Ġ= ĠType Alias Spec . builder ( ĊĠĠĠ Ġ" Method Binding < Req T , ĠResp T >", ĊĠĠĠ ĠPair :: class . as ClassName (). parameter ized By ( ĊĠĠĠĠĠĠĠ ĠMethod Descriptor :: class . as ClassName (). parameter ized By ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Variable Name (" Req T "), ĠType Variable Name (" Resp T ") ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠServer Call Handler :: class . as ClassName (). parameter ized By ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Variable Name (" Req T "), ĠType Variable Name (" Resp T ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ ) ĊĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠ Ġ. build () Ċ Ċ private Ġval Ġmethod ListType Alias Ġ= ĠType Alias Spec . builder ( ĊĠĠĠ Ġ" Method List ", ĊĠĠĠ ĠList :: class . as ClassName (). parameter ized By ( Type Variable Name (" Method Binding < *, Ġ*> ")) Ċ ) ĊĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠ Ġ. build () Ċ Ċ private Ġval Ġmethod Binding Fun Ġ= ĠFun Spec . builder (" method Binding ") ĊĠĠĠ Ġ. add Type Variable ( Type Variable Name (" Req T ")) ĊĠĠĠ Ġ. add Type Variable ( Type Variable Name (" Resp T ")) ĊĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠ Ġ" descriptor ", ĠMethod Descriptor :: class . as ClassName (). parameter ized By ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Variable Name (" Req T "), ĠType Variable Name (" Resp T ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġ. add Parameter ( ĊĠĠĠĠĠĠĠ Ġ" handler ", ĠServer Call Handler :: class . as ClassName (). parameter ized By ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Variable Name (" Req T "), ĠType Variable Name (" Resp T ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġ. returns ( method Binding Type Alias . type ) ĊĠĠĠ Ġ. add Statement (" return Ġ% T ( descriptor , Ġhandler )", ĠPair :: class . as ClassName ()) ĊĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠ Ġ. build () Ċ