/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠZ ac ĠS we ers Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . z acs we ers . mos h ix . sealed . annotations Ċ Ċ import Ġcom . squareup . mos hi . Json Adapter Ċ import Ġcom . squareup . mos hi . Json Class Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . squareup . mos hi . raw Type Ċ import Ġjava . lang . reflect . Type Ċ import Ġkotlin . annotation . Annotation Retention . RUNTIME Ċ import Ġkotlin . annotation . Annotation Target . CLASS Ċ Ċ /** Ċ Ġ* ĠUse Ġthis Ġannotation Ġto Ġspecify Ġthat Ġa Ġgiven Ġsealed Ġtype Ġis Ġa Ġsubtype Ġof Ġanother Ġsealed Ġtype Ġand Ċ Ġ* Ġuses Ġthe Ġsame Ġkey Ġas Ġthe Ġsup ertype . Ċ Ġ* Ċ Ġ* ĠThe Ġsup ertype Ġmust Ġbe Ġa Ġ_ direct _ Ġsup ertype . ĠIt Ġis Ġan Ġerror Ġto Ġannotate Ġthis Ġtype Ġwith Ġ[ Json Class ] Ċ Ġ* Ġas Ġthis Ġsuper se des Ġthat Ġannotation . Ċ Ġ*/ Ċ @ Target ( CLASS ) Ċ @ Retention ( RUNTIME ) Ċ public Ġannotation Ġclass ĠNested Se aled Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠOptional Ġfactory Ġthat Ġcan Ġbe Ġinstalled Ġto Ġenable Ġlookup Ġof Ġnested Ġsealed Ġtypes Ġdirectly Ġfrom ĊĠĠ Ġ* Ġ[ M oshi . adapter ] Ġcalls . ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġclass ĠFactory Ġ: ĠJson Adapter . Factory Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate ( type : ĠType , Ġannotations : ĠSet < Annotation >, Ġm oshi : ĠM oshi ): ĠJson Adapter < *> ? Ġ{ ĊĠĠĠĠĠ Ġif Ġ( annotations . isNotEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġraw Type Ġ= Ġtype . raw Type ĊĠĠĠĠĠ Ġreturn Ġif Ġ( raw Type . getAnnotation ( Nested Se aled :: class . java ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( sequence Of ( raw Type . super class ) Ġ+ Ġraw Type . interfaces ) ĊĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . getAnnotation ( Json Class :: class . java )?. generator ?. startsWith (" sealed :") Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġm oshi . adapter ( it ) Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ