package Ġde . max i _ se itz . annotation . processor . external Extension Ċ Ċ import Ġcom . squareup . kotlin po et . TypeName Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ class ĠExternal Extension Packages Ġ{ Ċ ĉ private Ġval Ġpackages : ĠMutable Map < String , ĠExternal Extension Package > Ġ= Ġmutable Map Of () ĊĉĊ ĉ operator Ġfun Ġget ( packageName : ĠString ) Ġ: ĠExternal Extension Package Ġ{ Ċĉ ĉ return Ġpackages . get Or Put ( packageName ) Ġ{ Ċĉĉ ĉ External Extension Package () Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ fun ĠforEach FunctionName ( callback : Ġ( packageName : ĠString , Ġfunction Name : ĠString , Ġfunctions : ĠExternal Extension Functions ) Ġ-> ĠUnit ) Ġ{ Ċĉ ĉ packages . forEach Ġ{ Ġ( packageName , Ġexternal Extension Package ) Ġ-> Ċĉĉ ĉ external Extension Package . function Names . forEach Ġ{ Ġ( function Name , Ġfunctions ) Ġ-> Ċĉĉĉ ĉ callback ( packageName , Ġfunction Name , Ġfunctions ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ class ĠExternal Extension Package Ġ{ Ċ ĉ internal Ġval Ġfunction Names : ĠMutable Map < String , ĠExternal Extension Functions > Ġ= Ġmutable Map Of () ĊĉĊ ĉ operator Ġfun Ġget ( function Name : ĠString ) Ġ: ĠExternal Extension Functions Ġ{ Ċĉ ĉ return Ġfunction Names . get Or Put ( function Name ) Ġ{ Ċĉĉ ĉ External Extension Functions () Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ class ĠExternal Extension Functions Ġ{ Ċ ĉ private Ġval Ġreceiv ers : ĠMutable Map < External Extension Function Signature , ĠExternal Extension Function > Ġ= Ġmutable Map Of () ĊĉĊ ĉ operator Ġfun Ġget ( Ċĉĉ ĉ receiver : ĠType Name , Ċĉĉ ĉ parameter Names : ĠList < String >, Ċĉĉ ĉ parameter Types : ĠList < TypeName > Ċ ĉ ) Ġ: ĠExternal Extension Function Ġ{ Ċĉ ĉ return Ġreceiv ers . get Or Put ( Pair ( receiver , Ġparameter Types )) Ġ{ Ċĉĉ ĉ External Extension Function ( parameter Names ) Ċĉ ĉ }. also Ġ{ Ċĉĉ ĉ if Ġ( it . parameter Names Ġ!= Ġparameter Names ) Ġ{ Ċĉĉĉ ĉ it . use Names Ġ= Ġfalse Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ fun ĠforEach Receiver ( callback : Ġ( receiver : ĠType Name , Ġparameter Names : ĠList < String >, Ġparameter Types : ĠList < TypeName >, Ġchild Functions : ĠMap < Type Mirror , ĠString >) Ġ-> ĠUnit ) Ġ{ Ċĉ ĉ re ceiv ers . forEach Ġ{ Ġ( signature , Ġfunction ) Ġ-> Ċĉĉ ĉ callback ( signature . receiver , Ġfunction . parameter Names , Ġsignature . parameters , Ġfunction . child Functions . toMap ()) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ private Ġtype alias ĠExternal Extension Function Signature Ġ= ĠPair < TypeName , ĠList < TypeName >> Ċ val ĠExternal Extension Function Signature . receiver Ġget () Ġ= Ġfirst Ċ val ĠExternal Extension Function Signature . parameters Ġget () Ġ= Ġsecond Ċ Ċ class ĠExternal Extension Function ( Ċĉ ĉ parameter Names : ĠList < String > Ċ ) Ġ{ Ċ ĉ internal Ġvar Ġchild Functions : ĠMutable Map < Type Mirror , ĠString > Ġ= Ġmutable Map Of () Ċ ĉ internal Ġvar Ġuse Names Ġ= Ġtrue ĊĉĊ ĉ internal Ġval Ġparameter Names Ġ= Ġparameter Names Ċĉ ĉ get () Ġ= Ġif Ġ( use Names ) Ġfield Ġelse Ġempty List () ĊĉĊ ĉ operator Ġfun Ġset ( receiver : ĠType Mirror , Ġfunction Name : ĠString ) Ġ{ Ċĉ ĉ child Functions [ receiver ] Ġ= Ġfunction Name Ċ ĉ } Ċ } Ċ