/* Ċ * ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠToast ĠInc . Ċ * Ċ * Ġ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 Ġcom . toast tab . proto kt . codegen . impl Ċ Ċ import Ġcom . toast tab . proto kt . codegen . algebra . AST Ċ import Ġcom . toast tab . proto kt . codegen . model . Import Ċ import Ġcom . toast tab . proto kt . codegen . protoc . Enum Ċ import Ġcom . toast tab . proto kt . codegen . protoc . Message Ċ import Ġcom . toast tab . proto kt . codegen . protoc . Oneof Ċ import Ġcom . toast tab . proto kt . codegen . protoc . Standard Field Ċ import Ġcom . toast tab . proto kt . codegen . protoc . TopLevel Type Ċ import Ġcom . toast tab . proto kt . codegen . protoc . Type Desc Ċ Ċ /** Ċ Ġ* ĠAll Ġclasses Ġdefined Ġin Ġthe Ġscope Ġof Ġa Ġmessage Ġthat Ġare Ġused Ġas Ġa Ġfield Ġtype Ċ Ġ* Ġare Ġadded Ġas Ġpossible Ġimport Ġcandidates . ĠWhen Ġthose Ġclasses Ġare Ġonly Ġused Ċ Ġ* Ġwithin Ġthe Ġmessage Ġthat Ġdefines Ġthem , Ġthere Ġis Ġno Ġneed Ġto Ġimport Ġthem Ġto Ġuse Ċ Ġ* Ġthem Ġwithout Ġqual ification Ġby Ġtheir Ġen closing Ġmessage Ġtype . ĠFor Ġexample : Ċ Ġ* Ċ Ġ* ĠĠĠ Ġclass ĠMessage ( Ċ Ġ* ĠĠĠĠĠĠĠ Ġval Ġenum : ĠSome Enum Ġ// Ġdoes Ġnot Ġneed Ġto Ġbe Ġ` Message . Some Enum ` Ċ Ġ* ĠĠĠ Ġ) Ġ: ĠK t Message Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠ Ġsealed Ġclass ĠSome Enum (...) Ġ: ĠK t Enum () Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠOPTION _ ONE Ġ: ĠSome Enum (...) Ċ Ġ* ĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠThese Ġimports Ġ_ are _ Ġnecessary Ġin Ġother Ġfiles Ġor Ġequivalent ly Ġwhen Ġused Ġin Ċ Ġ* Ġmessages Ġother Ġthan Ġthat Ġin Ġwhich Ġthey Ġare Ġdefined . Ċ Ġ*/ Ċ fun ĠSequence < Import >. filter Nested Classes Defined Loc ally ( ast s : ĠList < AST < Type Desc >>) Ġ= ĊĠĠĠ Ġfilter Not Ġ{ ĊĠĠĠĠĠĠĠ Ġit Ġis ĠImport . Class Ġ&& Ġit . nested Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġast s Using ( it , Ġast s ). contains Only ( ast Def ining ( it , Ġast s )) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġast s Using ( import : ĠImport . Class , Ġast s : ĠList < AST < Type Desc >>) Ġ= ĊĠĠĠ Ġast s . filter Ġ{ Ġsearch Types ( it . data . type . raw Type , Ġimport ) Ġ}. toSet () Ċ Ċ private Ġfun Ġsearch Types ( t : ĠTop Level Type , Ġimport : ĠImport . Class ): ĠBoolean Ġ= ĊĠĠĠ Ġt Ġis ĠMessage Ġ&& ĊĠĠĠĠĠĠĠ Ġ( search Fields ( t , Ġimport ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . nested Types . any Ġ{ Ġsearch Types ( it , Ġimport ) Ġ}) Ċ Ċ private Ġfun Ġsearch Fields ( msg : ĠMessage , Ġimport : ĠImport . Class ) Ġ= ĊĠĠĠ Ġmsg . fields . any Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStandard Field Ġ-> Ġit . type P Class Ġ== Ġimport . p Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOne of Ġ-> Ġit . fields . any Ġ{ Ġf Ġ-> Ġf . type P Class Ġ== Ġimport . p Class Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġast Def ining ( import : ĠImport . Class , Ġast s : ĠList < AST < Type Desc >>) Ġ= ĊĠĠĠ Ġast s . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġit . data . type . raw Type . let Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport . pkg Ġ== Ġkotlin Package ( it ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġis ĠMessage Ġ&& Ġsearch Message ( t , Ġt . name , Ġimport ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsingle OrNull Ġreturns Ġnull Ġif Ġmore Ġthan Ġone Ġmatch Ġrather Ġthan Ġthrowing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . single () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġsearch Message ( msg : ĠMessage , Ġname : ĠString , Ġimport : ĠImport . Class ): ĠBoolean Ġ= ĊĠĠĠ Ġname Ġ== Ġimport . p Class . nested Name Ġ|| ĊĠĠĠĠĠĠĠ Ġmsg . nested Types . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnested Name Ġ= Ġ"$ name .${ it . name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage Ġ-> Ġsearch Message ( it , Ġnested Name , Ġimport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEnum Ġ-> Ġnested Name Ġ== Ġimport . p Class . nested Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun Ġ< T > ĠSet < T >. contains Only ( t : ĠT ) Ġ= ĊĠĠĠ Ġsize Ġ== Ġ 1 Ġ&& Ġcontains ( t ) Ċ