/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 Ġ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 . backend . jvm . codegen Ċ Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Lower ed Declaration Origin Ċ import Ġorg . jetbrains . kotlin . backend . jvm . lower . constant Value Ċ import Ġorg . jetbrains . kotlin . codegen .* Ċ import Ġorg . jetbrains . kotlin . codegen . binding . Code gen Binding Ċ import Ġorg . jetbrains . kotlin . codegen . inline . Default Source Mapper Ċ import Ġorg . jetbrains . kotlin . codegen . inline . Source Mapper Ċ import Ġorg . jetbrains . kotlin . codegen . serialization . Jvm Serialization Bindings Ċ import Ġorg . jetbrains . kotlin . codegen . serialization . Jvm Serializer Extension Ċ import Ġorg . jetbrains . kotlin . config . Language Feature Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Const Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . load . java . Jvm Ab i Ċ import Ġorg . jetbrains . kotlin . load . kotlin . header . Kotlin Class Header Ċ import Ġorg . jetbrains . kotlin . name . Special Names Ċ import Ġorg . jetbrains . kotlin . psi . Kt Element Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils . is TopLevel Declaration Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Asm Types Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . diagnostics . Jvm Declaration Origin Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . diagnostics . Other Origin Ċ import Ġorg . jetbrains . kotlin . resolve . source . get Psi Ċ import Ġorg . jetbrains . kotlin . serialization . Descriptor Serializer Ċ import Ġorg . jetbrains . kotlin . types . Error Utils Ċ import Ġorg . jetbrains . org . object web . asm . Op codes Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġjava . io . File Ċ Ċ open Ġclass ĠClass Code gen Ġprotected Ġconstructor ( ĊĠĠĠ Ġinternal Ġval Ġir Class : ĠIr Class , ĊĠĠĠ Ġval Ġcontext : ĠJ vm Backend Context , ĊĠĠĠ Ġprivate Ġval Ġparent Class Code gen : ĠClass Code gen ? Ġ= Ġnull Ċ ) Ġ: ĠInner Class Consumer Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġinner Classes Ġ= Ġmutable ListOf < Class Descriptor >() ĊĊĠĠĠ Ġval Ġstate Ġ= Ġcontext . state ĊĊĠĠĠ Ġval Ġtype Mapper Ġ= Ġcontext . state . type Mapper ĊĊĠĠĠ Ġval Ġdescriptor Ġ= Ġir Class . descriptor ĊĊĠĠĠ Ġprivate Ġval Ġis Anonymous Ġ= ĠDescriptor Utils . is Anonymous Object ( ir Class . descriptor ) ĊĊĠĠĠ Ġval Ġtype : ĠType Ġ= Ġif Ġ( is Anonymous ) ĠCode gen Binding . asm Type For Anonymous Class ( ĊĠĠĠĠĠĠĠ Ġstate . binding Context , ĊĠĠĠĠĠĠĠ Ġdescriptor . source . get Psi () Ġas ĠK t Element ĊĠĠĠ Ġ) Ġelse Ġtype Mapper . map Type ( descriptor ) ĊĊĠĠĠ Ġprivate Ġval Ġsource Manager Ġ= Ġcontext . psi Source Manager ĊĊĠĠĠ Ġprivate Ġval Ġfile Entry Ġ= Ġsource Manager . getFile Entry ( ir Class . file Parent ) ĊĊĠĠĠ Ġval Ġpsi Element Ġ= Ġir Class . descriptor . psi Element ĊĊĠĠĠ Ġval Ġvisitor : ĠClass Builder Ġ= Ġcreate Class Builder () ĊĊĠĠĠ Ġopen Ġfun Ġcreate Class Builder () Ġ= Ġstate . factory . new Visitor ( ĊĠĠĠĠĠĠĠ ĠOther Origin ( psi Element , Ġdescriptor ), ĊĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠ Ġpsi Element ?. containing File ?. let Ġ{ Ġset Of ( it ) Ġ} Ġ?: Ġempty Set () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġvar Ġsource Mapper : ĠDefault Source Mapper ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġserializer Extension Ġ= ĠJ vm Serializer Extension ( visitor . serialization Bindings , Ġstate ) ĊĠĠĠ Ġprivate Ġval Ġserializer : ĠDescriptor Serializer ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġmetadata Ġ= Ġir Class . metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMetadata Source . Class Ġ-> ĠDescriptor Serializer . create ( metadata . descriptor , Ġserializer Extension , Ġparent Class Code gen ?. serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMetadata Source . File Ġ-> ĠDescriptor Serializer . create TopLevel ( serializer Extension ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Info Ġ= ĠSuper Class Info . get Super Class Info ( descriptor , Ġtype Mapper ) ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠImplementation Body Code gen . signature ( descriptor , Ġtype , ĠsuperClass Info , Ġtype Mapper ) ĊĊĠĠĠĠĠĠĠ Ġvisitor . define Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . class File Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . flags , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . java Generic Signature , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . super className , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . interfaces . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠAnnotation Code gen ( this , Ġcontext . state , Ġvisitor . visitor :: visit Annotation ). gen Annotations ( ir Class , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ/* ĠTODO : ĠTemporary Ġworkaround : ĠClass Builder Ġneeds Ġa Ġpath less Ġname . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġshort Name Ġ= ĠFile ( file Entry . name ). name ĊĠĠĠĠĠĠĠ Ġvisitor . visit Source ( short Name , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnested Classes Ġ= Ġir Class . declarations . map NotNull Ġ{ Ġdeclaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Code gen ( declaration , Ġcontext , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcompanion Object Code gen Ġ= Ġnested Classes . first OrNull Ġ{ Ġit . ir Class . is Companion Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġir Class . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Declaration ( declaration , Ġcompanion Object Code gen ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġnested Ġclasses Ġat Ġthe Ġend , Ġto Ġensure Ġthat Ġcodegen Ġfor Ġcompanion Ġobject Ġwill Ġhave Ġthe Ġnecessary ĠJVM Ġsignatures Ġin Ġits ĊĠĠĠĠĠĠĠ Ġ// Ġtrace Ġfor Ġproperties Ġmoved Ġto Ġthe Ġouter Ġclass ĊĠĠĠĠĠĠĠ Ġfor Ġ( codegen Ġin Ġnested Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . generate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate Kotlin Metadata Annotation () ĊĊĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Kotlin Metadata Annotation () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġmetadata Ġ= Ġir Class . metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMetadata Source . Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Proto Ġ= Ġserializer !!. class Proto ( metadata . descriptor ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Kotlin Metadata ( visitor , Ġstate , ĠKotlin Class Header . Kind . CLASS , Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA sm Util . write Annotation Data ( it , Ġserializer , Ġclass Proto ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMetadata Source . File Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Fq Name Ġ= Ġir Class . get Package Fragment () !!. fq Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Proto Ġ= Ġserializer !!. package Part Proto ( package Fq Name , Ġmetadata . descriptors ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Extension . serialize Jvm Package ( package Proto , Ġtype ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Kotlin Metadata ( visitor , Ġstate , ĠKotlin Class Header . Kind . FILE _ FAC ADE , Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA sm Util . write Annotation Data ( it , Ġserializer , Ġpackage Proto . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠJ vm PackageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Synt hetic Class Metadata ( visitor , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdone () Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Inner Classes () ĊĠĠĠĠĠĠĠ Ġwrite OuterClass And En closing Method () ĊĊĠĠĠĠĠĠĠ Ġsource Mapper ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSource Mapper . flush To Class Builder ( it , Ġvisitor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvisitor . done () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġgenerate ( ir Class : ĠIr Class , Ġcontext : ĠJ vm Backend Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġir Class . descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġcontext . state ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Error Utils . isError ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbad Descriptor ( ir Class , Ġstate . class Builder Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Class . name Ġ== ĠSpecial Names . NO _ NAME _ PROVIDED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbad Descriptor ( ir Class , Ġstate . class Builder Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Code gen ( ir Class , Ġcontext ). generate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbad Descriptor ( ir Class : ĠIr Class , Ġmode : ĠClass Builder Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode . generate B odies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Generating Ġbad Ġclass Ġin ĠClass Builder Mode Ġ= Ġ$ mode : Ġ${ ir Class . dump () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Declaration ( declaration : ĠIr Declaration , Ġcompanion Object Code gen : ĠClass Code gen ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Field Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Field ( declaration , Ġcompanion Object Code gen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Method ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Anonymous Initializer Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNested Ġclasses Ġare Ġgenerated Ġseparately ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unsupported Ġdeclaration Ġ$ declaration ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Local Class ( klass : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ ĠClass Code gen ( klass , Ġcontext , Ġthis ). generate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Field ( field : ĠIr Field , Ġcompanion Object Code gen : ĠClass Code gen ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( field . origin Ġ== ĠIr Declaration Origin . FA KE _ OVERRIDE ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= Ġtype Mapper . map Type ( field . descriptor ) ĊĠĠĠĠĠĠĠ Ġval Ġfield Signature Ġ= Ġtype Mapper . map Field Signature ( field . descriptor . type , Ġfield . descriptor ) ĊĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġfield . descriptor . name . asString () ĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠConstant Value Ġattribute Ġmakes Ġthe Ġinitializer Ġpart Ġof Ġthe ĠABI , Ġwhich Ġis Ġwhy Ġsince Ġ 1 . 4 ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġis Ġno Ġlonger Ġset Ġunless Ġthe Ġproperty Ġis Ġexplicitly Ġ` const `. ĊĠĠĠĠĠĠĠ Ġval Ġimplicit Const Ġ= Ġ! state . language Version Settings . supports Feature ( Language Feature . No Constant Value Attribute For Non Const Vals ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Asm Util . is Primitive ( fieldType ) Ġ|| ĠfieldType Ġ== ĠA sm Types . JAVA _ STRING _ TYPE ) ĊĠĠĠĠĠĠĠ Ġval Ġfv Ġ= Ġvisitor . new Field ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . Other Origin , Ġfield . flags , ĠfieldName , ĠfieldType . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Signature , Ġfield . constant Value ( implicit Const )?. value ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠAnnotation Code gen ( this , Ġstate , Ġfv :: visit Annotation ). gen Annotations ( field , ĠfieldType ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġfield . metadata ?. descriptor ĊĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcodegen Ġ= Ġif Ġ( Jvm Ab i . is Property With Backing Field In OuterClass ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Object Code gen Ġ?: Ġerror (" Class Ġwith Ġa Ġproperty Ġmoved Ġfrom Ġthe Ġcompanion Ġmust Ġhave Ġa Ġcompanion :\ n ${ ir Class . dump () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . visitor . serialization Bindings . put ( Jvm Serialization Bindings . FIELD _ FOR _ PROPERTY , Ġdescriptor , ĠfieldType Ġto ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Method ( method : ĠIr Function ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( method . origin Ġ== ĠIr Declaration Origin . FA KE _ OVERRIDE ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠFunction Code gen ( method , Ġthis ). generate (). asm Method ĊĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġmethod . metadata ĊĠĠĠĠĠĠĠ Ġwhen Ġ( metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMetadata Source . Property Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan 't Ġcheck Ġfor ĠJ vm Lower ed Declaration Origin . SYN TH ET IC _ METHOD _ FOR _ PROPERTY _ AN NOT ATIONS Ġbecause Ġfor Ġinterface Ġmethods ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmoved Ġto ĠDefault Imp ls , Ġorigin Ġis Ġchanged Ġto ĠDEFAULT _ IMP LS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġfix Ġorigin Ġsomehow , Ġbecause Ġotherwise Ġ$ annotations Ġmethods Ġin Ġinterfaces Ġalso Ġdon 't Ġhave ĠACC _ SYN TH ET IC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( method . name . asString (). endsWith ( Jvm Ab i . AN NOT ATED _ PROPERTY _ METHOD _ NAME _ SUFFIX )) Ġ{ Ġmethod . dump () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcodegen Ġ= Ġif Ġ( Descriptor Utils . is Interface ( metadata . descriptor . containing Declaration )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( ir Class . origin Ġ== ĠJ vm Lower ed Declaration Origin . DEFAULT _ IMP LS ) Ġ{ Ġir Class . dump () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Class Code gen !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . visitor . serialization Bindings . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ vm Serialization Bindings . SYN TH ET IC _ METHOD _ FOR _ PROPERTY , Ġmetadata . descriptor , Ġsignature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMetadata Source . Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . serialization Bindings . put ( Jvm Serialization Bindings . METHOD _ FOR _ FUNCTION , Ġmetadata . descriptor , Ġsignature ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Incorrect Ġmetadata Ġsource Ġ$ metadata Ġfor :\ n ${ method . dump () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Inner Classes () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠJ V MS 7 Ġ( 4 . 7 . 6 ): Ġa Ġnested Ġclass Ġor Ġinterface Ġmember Ġwill Ġhave ĠInner Classes Ġinformation ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġeach Ġen closing Ġclass Ġand Ġfor Ġeach Ġimmediate Ġmember ĊĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= Ġclass For Inner Class Record () ĊĠĠĠĠĠĠĠ Ġif Ġ( class Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Class Code gen ?. inner Classes ?. add ( class Descriptor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcodegen : ĠClass Code gen ? Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( codegen Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Class Ġ= Ġcodegen . class For Inner Class Record () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outer Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Classes . add ( outer Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen Ġ= Ġcodegen . parent Class Code gen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( inner Class Ġin Ġinner Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMember Code gen . write Inner Class ( inner Class , Ġtype Mapper , Ġvisitor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclass For Inner Class Record (): ĠClass Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parent Class Code gen Ġ!= Ġnull ) Ġdescriptor Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠIt 's Ġnecessary Ġfor Ġproper Ġrecover ing Ġof Ġclass Id Ġby Ġplain Ġstring ĠJVM Ġdescriptor Ġwhen Ġloading Ġannotations ĊĠĠĠ Ġ// ĠSee ĠFile Based Kotlin Class . convert Annotation Visitor ĊĠĠĠ Ġoverride Ġfun Ġadd Inner Class Info From Annotation ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠDeclaration Descriptor ? Ġ= Ġir Class . descriptor ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull Ġ&& Ġ! is TopLevel Declaration ( current )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġis ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Classes . add ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . containing Declaration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite OuterClass And En closing Method () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠJ V MS 7 Ġ( 4 . 7 . 7 ): ĠA Ġclass Ġmust Ġhave Ġan ĠEn closing Method Ġattribute Ġif Ġand Ġonly Ġif ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġis Ġa Ġlocal Ġclass Ġor Ġan Ġanonymous Ġclass . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġattribute Ġcontains Ġthe Ġinner most Ġclass Ġthat Ġen clo ses Ġthe Ġdeclaration Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġcurrent Ġclass . ĠIf Ġthe Ġcurrent Ġclass Ġis Ġimmediately Ġen closed Ġby Ġa Ġmethod ĊĠĠĠĠĠĠĠ Ġ// Ġor Ġconstructor , Ġthe Ġname Ġand Ġtype Ġof Ġthe Ġfunction Ġis Ġrecorded Ġas Ġwell . ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Class Code gen Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter ClassName Ġ= Ġparent Class Code gen . type . internal Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠSince Ġthe Ġclass Ġcould Ġhave Ġbeen Ġre parent ed Ġin Ġlower ings , Ġthis Ġcould ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbe Ġa Ġclass Ġinstead Ġof Ġthe Ġactual Ġfunction Ġthat Ġthe Ġclass Ġis Ġnested Ġinside ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġsource . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Declaration Ġ= Ġir Class . symbol . owner . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( containing Declaration Ġis ĠIr Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtype Mapper . map Asm Method ( containing Declaration . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit OuterClass ( outer ClassName , Ġmethod . name , Ġmethod . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit OuterClass ( outer ClassName , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget OrCreate Source Mapper (): ĠDefault Source Mapper Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( source Mapper Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Mapper Ġ= Ġcontext . getSource Mapper ( ir Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsource Mapper !! ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠIr Class . flags : ĠInt ĊĠĠĠ Ġget () Ġ= Ġorigin . flags Ġor ĠA sm Util . get Visibility Access Flag For Class ( descriptor ) Ġor Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis Annotation Class Ġ-> ĠOp codes . ACC _ AN NOT ATION Ġor ĠOp codes . ACC _ INTERFACE Ġor ĠOp codes . ACC _ AB STR ACT ĊĠĠĠĠĠĠĠ Ġis Interface Ġ-> ĠOp codes . ACC _ INTERFACE Ġor ĠOp codes . ACC _ AB STR ACT ĊĠĠĠĠĠĠĠ Ġis Enum Class Ġ-> ĠOp codes . ACC _ ENUM Ġor ĠOp codes . ACC _ SUPER Ġor Ġmod ality . flags ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠOp codes . ACC _ SUPER Ġor Ġmod ality . flags ĊĠĠĠ Ġ} Ċ Ċ private Ġval ĠIr Field . flags : ĠInt ĊĠĠĠ Ġget () Ġ= Ġorigin . flags Ġor Ġvisibility . flags Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( is Final ) ĠOp codes . ACC _ FINAL Ġelse Ġ 0 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( is Static ) ĠOp codes . ACC _ STATIC Ġelse Ġ 0 ) Ċ Ċ private Ġval ĠIr Declaration Origin . flags : ĠInt ĊĠĠĠ Ġget () Ġ= Ġ( if Ġ( is Synt hetic ) ĠOp codes . ACC _ SYN TH ET IC Ġelse Ġ 0 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( this Ġ== ĠIr Declaration Origin . FIELD _ FOR _ ENUM _ ENTRY ) ĠOp codes . ACC _ ENUM Ġelse Ġ 0 ) Ċ Ċ private Ġval ĠMod ality . flags : ĠInt ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMod ality . AB STR ACT , ĠMod ality . SE AL ED Ġ-> ĠOp codes . ACC _ AB STR ACT ĊĠĠĠĠĠĠĠ ĠMod ality . FINAL Ġ-> ĠOp codes . ACC _ FINAL ĊĠĠĠĠĠĠĠ ĠMod ality . OPEN Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" Unsupported Ġmod ality Ġ$ this ") ĊĠĠĠ Ġ} Ċ Ċ private Ġval ĠVisibility . flags : ĠInt ĊĠĠĠ Ġget () Ġ= ĠA sm Util . get Visibility Access Flag ( this ) Ġ?: Ġthrow ĠAssertionError (" Unsupported Ġvisibility Ġ$ this ") Ċ Ċ private Ġval ĠIr Field . Other Origin : ĠJ vm Declaration Origin ĊĠĠĠ Ġget () Ġ= ĠOther Origin ( descriptor . psi Element , Ġthis . descriptor ) Ċ Ċ internal Ġval ĠIr Function . Other Origin : ĠJ vm Declaration Origin ĊĠĠĠ Ġget () Ġ= ĠOther Origin ( descriptor . psi Element , Ġthis . descriptor ) Ċ