/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . ir . interpreter . state Ċ Ċ import Ġorg . jetbrains . kotlin . ir . interpreter . builtins . evaluate Intr insic Annotation Ċ import Ġorg . jetbrains . kotlin . ir . interpreter .* Ċ import Ġorg . jetbrains . kotlin . ir . interpreter . get Evaluate Intr insic Value Ċ import Ġorg . jetbrains . kotlin . ir . interpreter . get Primitive Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Field Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Simple Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl . Ir Function Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġjava . lang . invoke . Method Handle Ċ import Ġjava . lang . invoke . Method Handles Ċ import Ġjava . lang . invoke . MethodType Ċ Ċ internal Ġclass ĠWrapper ( val Ġvalue : ĠAny , Ġoverride Ġval Ġir Class : ĠIr Class ) Ġ: ĠComplex ( ir Class , Ġmutable ListOf ()) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtype Fq Name Ġ= Ġir Class . fq Name For Ir Serialization . to Unsafe () ĊĠĠĠ Ġprivate Ġval Ġreceiver Class Ġ= Ġir Class . default Type . getClass ( true ) ĊĊĠĠĠ Ġfun Ġget Method ( ir Function : ĠIr Function ): ĠMethod Handle ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ir Function . get Evaluate Intr insic Value ()?. isEmpty () Ġ== Ġtrue ) Ġreturn Ġnull Ġ// Ġthis Ġmethod Ġwill Ġhandle ĠIntr insic Evaluator ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġfunction Ġis Ġactually Ġa Ġgetter , Ġthen Ġuse Ġ" get ${ property . name . capitalize () }" Ġas Ġmethod Ġname ĊĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġ( ir Function Ġas ? ĠIr Simple Function )?. corre sponding Property Symbol ?. owner ?. name ?. asString () ĊĠĠĠĠĠĠĠ Ġval Ġproperty Call Ġ= ĠlistOf NotNull ( propertyName , Ġ" get ${ propertyName ?. capitalize () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġreceiver Class . methods . any Ġ{ Ġmethod Ġ-> Ġmethod . name Ġ== Ġit Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġintr insic Name Ġ= Ġget Java Original Name ( ir Function ) ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġintr insic Name Ġ?: Ġproperty Call Ġ?: Ġir Function . name . toString () ĊĠĠĠĠĠĠĠ Ġval Ġmethod Type Ġ= Ġir Function . getMethod Type () ĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Handles . lookup (). find Virtual ( receiver Class , ĠmethodName , Ġmethod Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġmethod Ġis Ġused Ġto Ġget Ġcorrect Ġjava Ġmethod Ġname ĊĠĠĠ Ġprivate Ġfun Ġget Java Original Name ( ir Function : ĠIr Function ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( ir Function . getLast Over ridden (). fq Name When Available ?. asString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . collections . Map .< get - entries >" Ġ-> Ġ" entrySet " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . collections . Map .< get - keys >" Ġ-> Ġ" keySet " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . CharSequence . get " Ġ-> Ġ" charAt " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . collections . Mutable List . remove At " Ġ-> Ġ" remove " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcompanion Object Value Ġ= Ġmap Of < String , ĠAny >(" kotlin . text . Regex \$ Companion " Ġto ĠRegex . Companion ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Companion Object ( ir Class : ĠIr Class ): ĠWrapper Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Name Ġ= Ġir Class . get Evaluate Intr insic Value () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Value Ġ= Ġcompanion Object Value [ objectName ] Ġ?: Ġthrow ĠAssertionError (" Companion Ġobject Ġ$ objectName Ġcannot Ġbe Ġinterpreted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWrapper ( object Value , Ġir Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Constructor Method ( ir Constructor : ĠIr Function ): ĠMethod Handle ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintr insic Value Ġ= Ġir Constructor . parent As Class . get Evaluate Intr insic Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intrinsic Value Ġ== Ġ" kotlin . Char " Ġ|| Ġintr insic Value Ġ== Ġ" kotlin . Long ") Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Type Ġ= Ġir Constructor . getMethod Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMethod Handles . lookup (). find Constructor ( ir Constructor . returnType . getClass ( true ), Ġmethod Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetStatic Method ( ir Function : ĠIr Function ): ĠMethod Handle ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintr insic Name Ġ= Ġir Function . get Evaluate Intr insic Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intrinsic Name ?. isEmpty () Ġ== Ġtrue ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj vm ClassName Ġ= ĠClass . forName ( intrinsic Name !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Type Ġ= Ġir Function . getMethod Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMethod Handles . lookup (). find Static ( jvm ClassName , Ġir Function . name . asString (), Ġmethod Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetStatic Getter ( field : ĠIr Field ): ĠMethod Handle ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj vm Class Ġ= Ġfield . parent As Class . default Type . getClass ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġfield . type . getClass ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMethod Handles . lookup (). find Static Getter ( jvm Class , Ġfield . name . asString (), ĠreturnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Enum Entry ( enum Class : ĠIr Class ): ĠMethod Handle ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintr insic Name Ġ= Ġenum Class . get Evaluate Intr insic Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intrinsic Name ?. isEmpty () Ġ== Ġtrue ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum ClassName Ġ= ĠClass . forName ( intrinsic Name !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Type Ġ= ĠMethod Type . method Type ( enum ClassName , ĠString :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMethod Handles . lookup (). find Static ( enum ClassName , Ġ" valueOf ", Ġmethod Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Function . getMethod Type (): ĠMethod Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Classes Ġ= Ġthis . value Parameters . map Ġ{ Ġit . type . getClass ( this . is Value Parameter Primitive As Object ( it . index )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġis ĠIr Simple Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġregular Ġmethods Ġand Ġfunctions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Class Ġ= Ġthis . returnType . getClass ( this . is ReturnType Primitive As Object ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Class Ġ= Ġthis . extension Receiver Parameter ?. type ?. getClass ( this . is Extension Receiver Primitive ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Type . method Type ( return Class , ĠlistOf NotNull ( extension Class ) Ġ+ Ġargs Classes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġconstructors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Type . method Type ( Void :: class . java Primitive Type , Ġargs Classes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Type . getClass ( as Object : ĠBoolean ): ĠClass < out ĠAny > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġthis . class OrNull ?. owner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfq Name Ġ= Ġowner ?. fq Name When Available ?. asString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Null Type Ġ= Ġthis . make NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġcheck Ġif Ġprimitive Ġarray Ġis Ġpossible Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . is Primitive Type () Ġ|| Ġnot Null Type . isString () Ġ-> Ġget Primitive Class ( notNull Type , Ġas Object ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . isArray () Ġ-> Ġif Ġ( as Object ) ĠArray < Any ?> :: class . java ObjectType Ġelse ĠArray < Any ?> :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . is Nothing () Ġ-> ĠNothing :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . is Any () Ġ-> ĠAny :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . isNumber () Ġ-> ĠNumber :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . is CharSequence () Ġ-> ĠCharSequence :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . is Comparable () Ġ-> ĠComparable :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . is Throwable () Ġ-> ĠThrowable :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null Type . is Iterable () Ġ-> ĠIterable :: class . java ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġimplement Ġfunction Ġmapping ; Ġall Ġcomplexity Ġis Ġto Ġmap Ġbig Ġar ity Ġto ĠFunction N ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// notNull Type . is K Function () Ġ-> ĠClass . forName (" kotlin . reflect . K Function ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// notNull Type . isFunction () Ġ-> ĠClass . forName (" kotlin . jvm . functions . Function _ TODO ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// notNull Type . is Suspend Function () Ġ|| Ġnot Null Type . is KS uspend Function () Ġ-> Ġthrow ĠAssertionError () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . Enum " Ġ-> ĠEnum :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . Collection " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable Collection " Ġ-> ĠCollection :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . List " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable List " Ġ-> ĠList :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . Set " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable Set " Ġ-> ĠSet :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . Map " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable Map " Ġ-> ĠMap :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . List Iterator " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable List Iterator " Ġ-> ĠList Iterator :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . Iterator " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable Iterator " Ġ-> ĠIterator :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . Map . Entry " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable Map . Mutable Entry " Ġ-> ĠMap . Entry :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġ" kotlin . collections . List Iterator " Ġ|| Ġfq Name Ġ== Ġ" kotlin . collections . Mutable List Iterator " Ġ-> ĠList Iterator :: class . java ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . has Annotation ( evaluate Intr insic Annotation ) Ġ-> ĠClass . forName ( owner !!. get Evaluate Intr insic Value ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ== Ġnull Ġ-> ĠAny :: class . java Ġ// Ġnull Ġif Ġthis . is Type Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠClass . forName ( owner . internal Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Function . get Original Over ridden Symbols (): ĠMutable List < Ir Function Symbol > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverridden Symbols Ġ= Ġmutable ListOf < Ir Function Symbol >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠIr Function Impl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpool Ġ= Ġthis . over ridden Symbols . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġpool . list Iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( symbol Ġin Ġiterator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol . owner . over ridden Symbols . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Symbols Ġ+= Ġsymbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . owner . over ridden Symbols . forEach Ġ{ Ġiterator . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( over ridden Symbols . isEmpty ()) Ġoverridden Symbols . add ( this . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoverridden Symbols ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Function . is Extension Receiver Primitive (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . extension Receiver Parameter ?. type ?. is Primitive Type () Ġ== Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Function . is ReturnType Primitive As Object (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( symbol Ġin Ġget Original Over ridden Symbols ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! symbol . owner . returnType . is Type Parameter () Ġ&& Ġ! symbol . owner . returnType . is Nullable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Function . is Value Parameter Primitive As Object ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( symbol Ġin Ġget Original Over ridden Symbols ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! symbol . owner . value Parameters [ index ]. type . is Type Parameter () Ġ&& Ġ! symbol . owner . value Parameters [ index ]. type . is Nullable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Wrapper ( obj ='$ type Fq Name ', Ġvalue =$ value )" ĊĠĠĠ Ġ} Ċ }