/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 . jetbrains . kotlin . builtins . functions Ċ Ċ import Ġorg . jetbrains . kotlin . builtins . functions . Function Class Descriptor . Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . serialization . de serialization . Class Descriptor Factory Ċ import Ġorg . jetbrains . kotlin . storage . Storage Manager Ċ Ċ /** Ċ Ġ* ĠPro duces Ġdescriptors Ġrepresenting Ġthe Ġf ict it ious Ġclasses Ġfor Ġfunction Ġtypes , Ġsuch Ġas Ġkotlin . Function 1 Ġor Ġkotlin . reflect . K Function 2 . Ċ Ġ*/ Ċ class ĠBuilt In F ict it ious Function Class Factory ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstorage Manager : ĠStorage Manager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmodule : ĠModule Descriptor Ċ ) Ġ: ĠClass Descriptor Factory Ġ{ ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠKind With Ar ity ( val Ġkind : ĠKind , Ġval Ġar ity : ĠInt ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġparse ClassName ( className : ĠString , Ġpackage Fq Name : ĠF q Name ): ĠKind With Ar ity ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= ĠFunction Class Descriptor . Kind . by Package ( package Fq Name ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġkind . className Prefix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! className . startsWith ( prefix )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġar ity Ġ= Ġto Int ( className . substring ( prefix . length )) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġvalidate Ġar ity , Ġshould Ġbe Ġ<= Ġ 2 5 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠKind With Ar ity ( kind , Ġar ity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Int ( s : ĠString ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġc Ġ- Ġ' 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d Ġ! in Ġ 0 .. 9 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult Ġ* Ġ 1 0 Ġ+ Ġd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Class ( class Id : ĠClass Id ): ĠClass Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( class Id . is Local Ġ|| Ġclass Id . is Nested Class ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġclass Id . relative ClassName . asString () ĊĠĠĠĠĠĠĠ Ġif Ġ(" Function " Ġ! in ĠclassName ) Ġreturn Ġnull Ġ// ĠAn Ġoptimization ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Fq Name Ġ= Ġclass Id . package Fq Name ĊĠĠĠĠĠĠĠ Ġval Ġ( kind , Ġar ity ) Ġ= Ġparse ClassName ( className , Ġpackage Fq Name ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġcontaining Package Fragment Ġ= Ġmodule . get Package ( package Fq Name ). fragments . single () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFunction Class Descriptor ( storage Manager , Ġcontaining Package Fragment , Ġkind , Ġar ity ) ĊĠĠĠ Ġ} Ċ } Ċ