/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . gradle . kotlin . dsl . codegen Ċ Ċ import Ġorg . gradle . api . Inc ub ating Ċ Ċ import Ġorg . gradle . kotlin . dsl . access ors . contains Ċ import Ġorg . gradle . kotlin . dsl . access ors . primitive Type Strings Ċ import Ġorg . gradle . kotlin . dsl . support . Class Bytes Repository Ċ import Ġorg . gradle . kotlin . dsl . support . class Path Bytes Repository For Ċ import Ġorg . gradle . kotlin . dsl . support . unsafe Lazy Ċ Ċ import Ġorg . jetbrains . org . object web . asm . Annotation Visitor Ċ import Ġorg . jetbrains . org . object web . asm . Attribute Ċ import Ġorg . jetbrains . org . object web . asm . Class Reader Ċ import Ġorg . jetbrains . org . object web . asm . Class Reader . SKIP _ CODE Ċ import Ġorg . jetbrains . org . object web . asm . Class Reader . SKIP _ DEBUG Ċ import Ġorg . jetbrains . org . object web . asm . Class Reader . SKIP _ FR AMES Ċ import Ġorg . jetbrains . org . object web . asm . Field Visitor Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ACC _ AB STR ACT Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ACC _ PUBLIC Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ACC _ STATIC Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ACC _ SYN TH ET IC Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ACC _ VAR ARGS Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ASM 6 Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġorg . jetbrains . org . object web . asm . Type Path Ċ import Ġorg . jetbrains . org . object web . asm . signature . Signature Reader Ċ import Ġorg . jetbrains . org . object web . asm . signature . Signature Visitor Ċ import Ġorg . jetbrains . org . object web . asm . tree . Annotation Node Ċ import Ġorg . jetbrains . org . object web . asm . tree . Class Node Ċ import Ġorg . jetbrains . org . object web . asm . tree . Method Node Ċ Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . File Ċ import Ġjava . util . Array Deque Ċ Ċ import Ġjavax . annotation . Nullable ĊĊ Ċ @ Visible ForTesting Ċ fun Ġapi Type Provider For ( ĊĠĠĠ Ġclass Path : ĠList < File >, ĊĠĠĠ Ġclass Path Dependencies : ĠList < File > Ġ= Ġempty List (), ĊĠĠĠ Ġparameter Names Supplier : ĠParameter Names Supplier Ġ= Ġ{ Ġnull Ġ} Ċ ): ĠApi Type Provider Ġ= ĊĊĠĠĠ ĠApi Type Provider ( class Path Bytes Repository For ( class Path , Ġclass Path Dependencies ), Ġparameter Names Supplier ) ĊĊ Ċ private Ċ type alias ĠApi Type Supplier Ġ= Ġ() Ġ-> ĠApi Type ĊĊ Ċ type alias ĠParameter Names Supplier Ġ= Ġ( String ) Ġ-> ĠList < String >? ĊĊ Ċ fun ĠParameter Names Supplier . parameter Names For ( typeName : ĠString , Ġfunction Name : ĠString , Ġparameter Type Names : ĠList < String >): ĠList < String >? Ġ= ĊĠĠĠ Ġthis ("$ typeName .$ function Name (${ parameter Type Names . join ToString (",") }) ") ĊĊ Ċ /** Ċ Ġ* ĠProvides Ġ[ Api Type ] Ġinstances Ġby ĠKotlin Ġsource Ġname Ġfrom Ġa Ġclass Ġpath . Ċ Ġ* Ċ Ġ* ĠKeep s ĠJ AR Ġfiles Ġopen Ġfor Ġfast Ġlookup , Ġmust Ġbe Ġclosed . Ċ Ġ* ĠOnce Ġclosed , Ġtype Ġgraph Ġnavigation Ġfrom Ġ[ Api Type ] Ġand Ġ[ Api Function ] Ġinstances Ċ Ġ* Ġwill Ġthrow Ġ[ IllegalStateException ]. Ċ Ġ* Ċ Ġ* ĠLimit ations : Ċ Ġ* Ġ- Ġsupports ĠJava Ġbyte Ġcode Ġonly , Ġnot ĠKotlin Ċ Ġ* Ġ- Ġdoes Ġnot Ġsupport Ġnested ĠJava Ġarrays Ġas Ġmethod Ġparameters Ċ Ġ* Ġ- Ġdoes Ġnot Ġsupport Ġgener ics Ġwith Ġmultiple Ġbounds Ċ Ġ*/ Ċ @ Visible ForTesting Ċ class ĠApi Type Provider Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠClass Bytes Repository , ĊĠĠĠ Ġparameter Names Supplier : ĠParameter Names Supplier Ċ ) Ġ: ĠClose able Ġ{ ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġcontext Ġ= ĠContext ( this , Ġparameter Names Supplier ) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġapi Types By Source Name Ġ= Ġmutable Map Of < String , ĠApi Type Supplier ?> () ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġvar Ġclosed Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġtype ( source Name : ĠString ): ĠApi Type ? Ġ= Ġopen Ġ{ ĊĠĠĠĠĠĠĠ Ġapi Types By Source Name . compute If Absent ( source Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . class Bytes For ( source Name )?. let Ġ{ Ġapi Type For ( source Name ) Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġall Types (): ĠSequence < Api Type > Ġ= Ġopen Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . all Classes Bytes By Source Name (). map Ġ{ Ġ( source Name , Ġclass Bytes ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi Types By Source Name . compute If Absent ( source Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi Type For ( source Name , Ġclass Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . close () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġapi Type For ( source Name : ĠString , Ġclass Bytes : Ġ() Ġ-> ĠByteArray ) Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠApi Type ( source Name , Ġclass Node For ( class Bytes ), Ġcontext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġclass Node For ( class Bytes Supplier : Ġ() Ġ-> ĠByteArray ) Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠApi Type Class Node (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Reader ( class Bytes Supplier ()). accept ( it , ĠSKIP _ DEBUG Ġor ĠSKIP _ CODE Ġor ĠSKIP _ FR AMES ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġ< T > Ġopen ( action : Ġ() Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( closed ) Ġthrow ĠIllegalStateException (" Api Type Provider Ġclosed !") ĊĠĠĠĠĠĠĠ Ġelse Ġaction () ĊĊĠĠĠ Ġinternal ĊĠĠĠ Ġclass ĠContext ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtype Provider : ĠApi Type Provider , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġparameter Names Supplier : ĠParameter Names Supplier ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġtype ( source Name : ĠString ): ĠApi Type ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Provider . type ( source Name ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġparameter Names For ( typeName : ĠString , Ġfunction Name : ĠString , Ġparameter Type Names : ĠList < String >): ĠList < String >? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Names Supplier . parameter Names For ( typeName , Ġfunction Name , Ġparameter Type Names ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Visible ForTesting Ċ class ĠApi Type Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġsource Name : ĠString , ĊĠĠĠ Ġprivate Ġval Ġdelegate Supplier : Ġ() Ġ-> ĠClass Node , ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠApi Type Provider . Context Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġis Public : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdelegate . access . is Public ĊĊĠĠĠ Ġval Ġis Deprecated : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdelegate . visible Annotations . has < java . lang . Deprecated >() ĊĊĠĠĠ Ġval Ġis Inc ub ating : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdelegate . visible Annotations . has < Inc ub ating >() ĊĊĠĠĠ Ġval Ġis SAM : ĠBoolean Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . access . is Abstract Ġ&& Ġsingle Abstract Method Of ( delegate )?. access ?. is Public Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtype Parameters : ĠList < Api Type Usage > Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . api Type Parameters For ( visited Signature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfunctions : ĠList < Api Function > Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . methods . filter (:: is Sign ificant Declaration ). map Ġ{ ĠApi Function ( this , Ġit , Ġcontext ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġsingle Abstract Method Of ( class Node : ĠClass Node ) Ġ= ĊĠĠĠĠĠĠĠ Ġclass Node . methods . single OrNull Ġ{ Ġit . access . run Ġ{ Ġ! is Static Ġ&& Ġis Abstract Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTest Ġif Ġa Ġmethod Ġis Ġa Ġprime Ġdeclaration Ġor Ġan Ġoverrides Ġthat Ġchange Ġthe Ġsignature . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThere 's Ġno Ġway Ġto Ġtell Ġfrom Ġthe Ġbyte Ġcode Ġthat Ġa Ġmethod Ġoverrides Ġthe Ġsignature ĊĠĠĠĠ Ġ* Ġof Ġa Ġparent Ġdeclaration Ġother Ġthan Ġc raw ling Ġup Ġthe Ġtype Ġhierarchy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġis Sign ificant Declaration ( method Node : ĠMethod Node ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Node . access . is Synt hetic ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! has Super Type ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġfun ĠArray Deque < String >. add Super Types Of ( class Node : ĠClass Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Node . interfaces . forEach Ġ{ Ġpush ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Node . super Name Ġ!= Ġnull ) Ġpush ( class Node . super Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsuper Type Stack Ġ= ĠArray Deque < String >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Super Types Of ( delegate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvisited Ġ= Ġmutable Set Of < String >() ĊĊĠĠĠĠĠĠĠ Ġval Ġmatches Method Node Ġ= Ġ{ Ġcandidate : ĠMethod Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate . desc Ġ== Ġmethod Node . desc Ġ&& Ġcandidate . signature Ġ== Ġmethod Node . signature ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( super Type Stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper TypeName Ġ= Ġsuper Type Stack . pop () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! visited . add ( super TypeName )) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Type Ġ= Ġtype For Internal Name ( super TypeName ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Type . delegate . methods . any ( matches Method Node )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Type Stack . add Super Types Of ( super Type . delegate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġtype For Internal Name ( internal Type : ĠString ): ĠApi Type ? Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . type ( source Name Of Binary Name ( binary Name Of Internal Name ( internal Type ))) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġhas Super Type : ĠBoolean Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . interfaces . isNotEmpty () Ġ|| Ġdelegate . super Name Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġdelegate : ĠClass Node Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate Supplier () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġvisited Signature : ĠClass Signature Visitor ? Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . signature ?. let Ġ{ Ġsignature Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Signature Visitor (). also Ġ{ ĠSignature Reader ( signature ). accept ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Visible ForTesting Ċ class ĠApi Function Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġowner : ĠApi Type , ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠMethod Node , ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠApi Type Provider . Context Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġname : ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġdelegate . name ĊĊĠĠĠ Ġval Ġis Public : ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġdelegate . access . is Public ĊĊĠĠĠ Ġval Ġis Deprecated : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġowner . is Deprecated Ġ|| Ġdelegate . visible Annotations . has < java . lang . Deprecated >() ĊĊĠĠĠ Ġval Ġis Inc ub ating : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġowner . is Inc ub ating Ġ|| Ġdelegate . visible Annotations . has < Inc ub ating >() ĊĊĠĠĠ Ġval Ġis Static : ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġdelegate . access . is Static ĊĊĠĠĠ Ġval Ġtype Parameters : ĠList < Api Type Usage > Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . api Type Parameters For ( visited Signature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparameters : ĠList < Api Function Parameter > Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . api Function Parameters For ( this , Ġdelegate , Ġvisited Signature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠreturnType : ĠApi Type Usage Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . api Type Usage For ReturnType ( delegate , Ġvisited Signature ?. returnType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġvisited Signature : ĠMethod Signature Visitor ? Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . signature ?. let Ġ{ Ġsignature Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Signature Visitor (). also Ġ{ Ġvisitor Ġ-> ĠSignature Reader ( signature ). accept ( visitor ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Visible ForTesting Ċ data Ġclass ĠApi Type Usage Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġsource Name : ĠString , ĊĠĠĠ Ġval Ġis Nullable : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval Ġtype : ĠApi Type ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġvariance : ĠVari ance Ġ= ĠVari ance . IN VARIANT , ĊĠĠĠ Ġval Ġtype Arguments : ĠList < Api Type Usage > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġbounds : ĠList < Api Type Usage > Ġ= Ġempty List () Ċ ) Ġ{ ĊĠĠĠ Ġval Ġis Raw : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtype Arguments . isEmpty () Ġ&& Ġtype ?. type Parameters ?. isEmpty () Ġ!= Ġfalse Ċ } ĊĊ Ċ @ Visible ForTesting Ċ enum Ġclass ĠVari ance Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresent Ġan Ġinvariant Ġtype Ġargument . ĊĠĠĠĠ Ġ* Ġe . g . Ġ`< T >` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠIN VARIANT , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresent Ġa Ġco variant Ġtype Ġargument . ĊĠĠĠĠ Ġ* ĠAlso Ġknown Ġas Ġ" extends - bound " Ġor Ġ" upper Ġbound ". ĊĠĠĠĠ Ġ* Ġe . g . Ġ` <? Ġextends ĠT >` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠCO VARIANT , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresent Ġa Ġcontr av ari ant Ġtype Ġargument . ĊĠĠĠĠ Ġ* ĠAlso Ġknown Ġas Ġ" super - bound " Ġor Ġ" lower Ġbound ". ĊĠĠĠĠ Ġ* Ġe . g . Ġ` <? Ġsuper ĠT >` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠCON TR AV ARI ANT Ċ } ĊĊ Ċ @ Visible ForTesting Ċ data Ġclass ĠApi Function Parameter Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġindex : ĠInt , ĊĠĠĠ Ġval Ġis Var args : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġname Supplier : Ġ() Ġ-> ĠString ?, ĊĠĠĠ Ġval Ġtype : ĠApi Type Usage Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġname : ĠString ? Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġname Supplier () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ċ fun ĠApi Type Provider . Context . api Type Usage For ( ĊĠĠĠ Ġbinary Name : ĠString , ĊĠĠĠ Ġis Nullable : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġvariance : ĠVari ance Ġ= ĠVari ance . IN VARIANT , ĊĠĠĠ Ġtype Arguments : ĠList < Type Signature Visitor > Ġ= Ġempty List (), ĊĠĠĠ Ġbounds : ĠList < Type Signature Visitor > Ġ= Ġempty List () Ċ ): ĠApi Type Usage Ġ= ĊĊĠĠĠ Ġif Ġ( binary Name Ġ== Ġ"? ") Ġstar Projection Type Usage ĊĠĠĠ Ġelse Ġsource Name Of Binary Name ( binary Name ). let Ġ{ Ġsource Name Ġ-> ĊĠĠĠĠĠĠĠ ĠApi Type Usage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ( source Name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariance , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . map Ġ{ Ġapi Type Usage For ( it . binary Name , Ġvariance Ġ= Ġit . variance , Ġtype Arguments Ġ= Ġit . type Arguments ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . map Ġ{ Ġapi Type Usage For ( it . binary Name , Ġvariance Ġ= Ġit . variance , Ġtype Arguments Ġ= Ġit . type Arguments ) Ġ}) ĊĠĠĠ Ġ} ĊĊ Ċ internal Ċ val ĠApi Type Usage . is Star Projection Type Usage ĊĠĠĠ Ġget () Ġ= Ġthis Ġ=== Ġstar Projection Type Usage ĊĊ Ċ internal Ċ val Ġstar Projection Type Usage Ġ= ĠApi Type Usage ("* ") ĊĊ Ċ internal Ċ val Ġsingleton ListOf Star Projection Type Usage Ġ= ĠlistOf ( star Projection Type Usage ) ĊĊ Ċ private Ċ fun ĠApi Type Provider . Context . api Type Parameters For ( visited Signature : ĠBase Signature Visitor ?): ĠList < Api Type Usage > Ġ= ĊĠĠĠ Ġvisited Signature ?. type Parameters ?. map Ġ{ Ġ( binary Name , Ġbounds ) Ġ-> Ġapi Type Usage For ( binary Name , Ġbounds Ġ= Ġbounds ) Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġempty List () ĊĊ Ċ private Ċ fun ĠApi Type Provider . Context . api Function Parameters For ( function : ĠApi Function , Ġdelegate : ĠMethod Node , Ġvisited Signature : ĠMethod Signature Visitor ?) Ġ= ĊĠĠĠ Ġdelegate . visible Parameter Annotations ?. map Ġ{ Ġit . has < Nullable >() Ġ}. let Ġ{ Ġparameters Null ability Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġparameter Types Binary Names Ġ= Ġvisited Signature ?. parameters ?. map Ġ{ Ġif Ġ( it . isArray ) Ġ"${ it . type Arguments . single (). binary Name } []" Ġelse Ġit . binary Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠType . get Argument Types ( delegate . desc ). map Ġ{ Ġit . className Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnames Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Names For ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . owner . source Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Types Binary Names ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġparameter Types Binary Names . map Indexed Ġ{ Ġidx , Ġparameter Type Binary Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Nullable Ġ= Ġparameters Null ability ?. get ( idx ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Parameter Ġ= Ġvisited Signature ?. parameters ?. get ( idx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter TypeName Ġ= Ġsignature Parameter ?. binary Name Ġ?: Ġparameter Type Binary Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariance Ġ= Ġsignature Parameter ?. variance Ġ?: ĠVari ance . IN VARIANT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Arguments Ġ= Ġsignature Parameter ?. type Arguments Ġ?: Ġempty List < Type Signature Visitor >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Function Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġidx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Var args Ġ= Ġidx Ġ== Ġparameter Types Binary Names . last Index Ġ&& Ġdelegate . access . is Var args , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Supplier Ġ= Ġ{ Ġnames ?. get ( idx ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġapi Type Usage For ( parameter TypeName , Ġis Nullable , Ġvariance , Ġtype Arguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ private Ċ fun ĠApi Type Provider . Context . api Type Usage For ReturnType ( delegate : ĠMethod Node , ĠreturnType : ĠType Signature Visitor ?) Ġ= ĊĠĠĠ Ġapi Type Usage For ( ĊĠĠĠĠĠĠĠ ĠreturnType ?. binary Name Ġ?: ĠType . get ReturnType ( delegate . desc ). className , ĊĠĠĠĠĠĠĠ Ġdelegate . visible Annotations . has < Nullable >(), ĊĠĠĠĠĠĠĠ ĠreturnType ?. variance Ġ?: ĠVari ance . IN VARIANT , ĊĠĠĠĠĠĠĠ ĠreturnType ?. type Arguments Ġ?: Ġempty List ()) ĊĊ Ċ private Ċ inline Ġfun Ġ< re ified ĠAnnotation Type Ġ: ĠAny > ĠList < Annotation Node > ?. has () Ġ= ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġfalse ĊĠĠĠ Ġelse ĠType . get Descriptor ( Annotation Type :: class . java ). let Ġ{ Ġdesc Ġ-> Ġany Ġ{ Ġit . desc Ġ== Ġdesc Ġ} Ġ} ĊĊ Ċ private Ċ class ĠApi Type Class Node Ġ: ĠClass Node ( ASM 6 ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Source ( file : ĠString ?, Ġdebug : ĠString ?) Ġ= ĠUnit ĊĠĠĠ Ġoverride Ġfun Ġvisit OuterClass ( owner : ĠString ?, Ġname : ĠString ?, Ġdesc : ĠString ?) Ġ= ĠUnit ĊĠĠĠ Ġoverride Ġfun Ġvisit Type Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġvisit Attribute ( attr : ĠAttribute ?) Ġ= ĠUnit ĊĠĠĠ Ġoverride Ġfun Ġvisit Inner Class ( name : ĠString ?, Ġouter Name : ĠString ?, Ġinner Name : ĠString ?, Ġaccess : ĠInt ) Ġ= ĠUnit ĊĠĠĠ Ġoverride Ġfun Ġvisit Field ( access : ĠInt , Ġname : ĠString ?, Ġdesc : ĠString ?, Ġsignature : ĠString ?, Ġvalue : ĠAny ?): ĠField Visitor ? Ġ= Ġnull Ċ } ĊĊ Ċ private Ċ abstract Ġclass ĠBase Signature Visitor Ġ: ĠSignature Visitor ( ASM 6 ) Ġ{ ĊĊĠĠĠ Ġval Ġtype Parameters : ĠMutable Map < String , ĠMutable List < Type Signature Visitor >> Ġ= ĠLinkedHashMap ( 1 ) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġvar Ġcurrent Type Parameter : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Formal Type Parameter ( binary Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Parameters [ binary Name ] Ġ= ĠArrayList ( 1 ) ĊĠĠĠĠĠĠĠ Ġcurrent Type Parameter Ġ= Ġbinary Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class Bound (): ĠSignature Visitor Ġ= ĊĠĠĠĠĠĠĠ Ġvisit Type Parameter Bound () ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Interface Bound (): ĠSignature Visitor Ġ= ĊĠĠĠĠĠĠĠ Ġvisit Type Parameter Bound () ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġvisit Type Parameter Bound () Ġ= ĊĠĠĠĠĠĠĠ ĠType Signature Visitor (). also Ġ{ Ġtype Parameters [ current Type Parameter ] !!. add ( it ) Ġ} Ċ } ĊĊ Ċ private Ċ class ĠClass Signature Visitor Ġ: ĠBase Signature Visitor () ĊĊ Ċ private Ċ class ĠMethod Signature Visitor Ġ: ĠBase Signature Visitor () Ġ{ ĊĊĠĠĠ Ġval Ġparameters : ĠMutable List < Type Signature Visitor > Ġ= ĠArrayList ( 1 ) ĊĊĠĠĠ Ġval ĠreturnType Ġ= ĠType Signature Visitor () ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ParameterType (): ĠSignature Visitor Ġ= ĊĠĠĠĠĠĠĠ ĠType Signature Visitor (). also Ġ{ Ġparameters . add ( it ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ReturnType (): ĠSignature Visitor Ġ= ĊĠĠĠĠĠĠĠ ĠreturnType Ċ } ĊĊ Ċ private Ċ class ĠType Signature Visitor ( val Ġvariance : ĠVari ance Ġ= ĠVari ance . IN VARIANT ) Ġ: ĠSignature Visitor ( ASM 6 ) Ġ{ ĊĊĠĠĠ Ġvar ĠisArray Ġ= Ġfalse ĊĊĠĠĠ Ġlateinit Ġvar Ġbinary Name : ĠString ĊĊĠĠĠ Ġval Ġtype Arguments Ġ= ĠArrayList < Type Signature Visitor >( 1 ) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġvar Ġexpect Type Argument Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġvisit BaseType ( descriptor : ĠChar ) Ġ= ĊĠĠĠĠĠĠĠ Ġvisit Binary Name ( binary Name Of BaseType ( descriptor )) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ArrayType (): ĠSignature Visitor Ġ= ĊĠĠĠĠĠĠĠ ĠType Signature Visitor (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Binary Name (" kotlin . Array ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisArray Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ClassType ( internal Name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġvisit Binary Name ( binary Name Of Internal Name ( internal Name )) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Inner ClassType ( local Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinary Name Ġ+= Ġ"${ '$ '} $ local Name " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Argument () Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Arguments . add ( Type Signature Visitor (). also Ġ{ Ġit . binary Name Ġ= Ġ" ?" Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Argument ( wildcard : ĠChar ): ĠSignature Visitor Ġ= ĊĠĠĠĠĠĠĠ ĠType Signature Visitor ( bound Of ( wildcard )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Type Argument Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Variable ( internal Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Binary Name ( binary Name Of Internal Name ( internal Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġvisit Binary Name ( binary Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expect Type Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Signature Visitor (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSignature Reader ( binary Name ). accept ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Type Argument Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . binary Name Ġ= Ġbinary Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġbound Of ( wildcard : ĠChar ) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( wildcard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'+' Ġ-> ĠVari ance . CO VARIANT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'-' Ġ-> ĠVari ance . CON TR AV ARI ANT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠVari ance . IN VARIANT ĊĠĠĠĠĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ċ fun Ġbinary Name Of BaseType ( descriptor : ĠChar ) Ġ= ĊĠĠĠ ĠType . getType ( descriptor . toString ()). className ĊĊ Ċ private Ċ fun Ġbinary Name Of Internal Name ( internal Name : ĠString ): ĠString Ġ= ĊĠĠĠ ĠType . get ObjectType ( internal Name ). className ĊĊ Ċ private Ċ fun Ġsource Name Of Binary Name ( binary Name : ĠString ): ĠString Ġ= ĊĠĠĠ Ġwhen Ġ( binary Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" void " Ġ-> Ġ" Unit " ĊĠĠĠĠĠĠĠ Ġ" ?" Ġ-> Ġ"*" ĊĠĠĠĠĠĠĠ Ġin Ġmapped Type Strings . keys Ġ-> Ġmapped Type Strings [ binary Name ] !! ĊĠĠĠĠĠĠĠ Ġin Ġprimitive Type Strings . keys Ġ-> Ġprimitive Type Strings [ binary Name ] !! ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbinary Name . replace ('$ ', Ġ'.') ĊĠĠĠ Ġ} ĊĊ Ċ /** Ċ Ġ* ĠSee Ġhttps :// kotlin lang . org / docs / reference / java - interop . html # mapped - types Ċ Ġ*/ Ċ private Ċ val Ġmapped Type Strings Ġ= ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ// ĠBuilt - ins ĊĠĠĠĠĠĠĠ Ġ" java . lang . Clone able " Ġto Ġ" kotlin . Clone able ", ĊĠĠĠĠĠĠĠ Ġ" java . lang . Comparable " Ġto Ġ" kotlin . Comparable ", ĊĠĠĠĠĠĠĠ Ġ" java . lang . Enum " Ġto Ġ" kotlin . Enum ", ĊĠĠĠĠĠĠĠ Ġ" java . lang . Annotation " Ġto Ġ" kotlin . Annotation ", ĊĠĠĠĠĠĠĠ Ġ" java . lang . Deprecated " Ġto Ġ" kotlin . Deprecated ", ĊĠĠĠĠĠĠĠ Ġ" java . lang . CharSequence " Ġto Ġ" kotlin . CharSequence ", ĊĠĠĠĠĠĠĠ Ġ" java . lang . Number " Ġto Ġ" kotlin . Number ", ĊĠĠĠĠĠĠĠ Ġ" java . lang . Throwable " Ġto Ġ" kotlin . Throwable ", ĊĠĠĠĠĠĠĠ Ġ// ĠCollections ĊĠĠĠĠĠĠĠ Ġ" java . util . Iterable " Ġto Ġ" kotlin . collections . Iterable ", ĊĠĠĠĠĠĠĠ Ġ" java . util . Iterator " Ġto Ġ" kotlin . collections . Iterator ", ĊĠĠĠĠĠĠĠ Ġ" java . util . List Iterator " Ġto Ġ" kotlin . collections . List Iterator ", ĊĠĠĠĠĠĠĠ Ġ" java . util . Collection " Ġto Ġ" kotlin . collections . Collection ", ĊĠĠĠĠĠĠĠ Ġ" java . util . List " Ġto Ġ" kotlin . collections . List ", ĊĠĠĠĠĠĠĠ Ġ" java . util . ArrayList " Ġto Ġ" kotlin . collections . ArrayList ", ĊĠĠĠĠĠĠĠ Ġ" java . util . Set " Ġto Ġ" kotlin . collections . Set ", ĊĠĠĠĠĠĠĠ Ġ" java . util . HashSet " Ġto Ġ" kotlin . collections . HashSet ", ĊĠĠĠĠĠĠĠ Ġ" java . util . Linked HashSet " Ġto Ġ" kotlin . collections . Linked HashSet ", ĊĠĠĠĠĠĠĠ Ġ" java . util . Map " Ġto Ġ" kotlin . collections . Map ", ĊĠĠĠĠĠĠĠ Ġ" java . util . Map . Entry " Ġto Ġ" kotlin . collections . Map . Entry ", ĊĠĠĠĠĠĠĠ Ġ" java . util . HashMap " Ġto Ġ" kotlin . collections . HashMap ", ĊĠĠĠĠĠĠĠ Ġ" java . util . Linked HashMap " Ġto Ġ" kotlin . collections . Linked HashMap ") ĊĊ Ċ private Ċ inline Ġval ĠInt . is Static : ĠBoolean ĊĠĠĠ Ġget () Ġ= ĠACC _ STATIC Ġin Ġthis ĊĊ Ċ private Ċ inline Ġval ĠInt . is Public : ĠBoolean ĊĠĠĠ Ġget () Ġ= ĠACC _ PUBLIC Ġin Ġthis ĊĊ Ċ private Ċ inline Ġval ĠInt . is Abstract : ĠBoolean ĊĠĠĠ Ġget () Ġ= ĠACC _ AB STR ACT Ġin Ġthis ĊĊ Ċ private Ċ inline Ġval ĠInt . is Var args : ĠBoolean ĊĠĠĠ Ġget () Ġ= ĠACC _ VAR ARGS Ġin Ġthis ĊĊ Ċ private Ċ inline Ġval ĠInt . is Synt hetic : ĠBoolean ĊĠĠĠ Ġget () Ġ= ĠACC _ SYN TH ET IC Ġin Ġthis Ċ