/* Ċ Ġ* Ġ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 . codegen Ċ Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . progress . Process Canceled Exception Ċ import Ġcom . intellij . util . Array Util Ċ import Ġcom . intellij . util . Smart List Ċ import Ġorg . jetbrains . kotlin . codegen . context . Field Owner Context Ċ import Ġorg . jetbrains . kotlin . codegen . context . Method Context Ċ import Ġorg . jetbrains . kotlin . codegen . state . Generation State Ċ import Ġorg . jetbrains . kotlin . config . Incremental Compilation Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Member Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Package Fragment Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Utils Ċ import Ġorg . jetbrains . kotlin . file Classes . Jvm File Class Util Ċ import Ġorg . jetbrains . kotlin . file Classes . getFile ClassType Ċ import Ġorg . jetbrains . kotlin . load . java . Jvm Annotation Names Ċ import Ġorg . jetbrains . kotlin . load . kotlin . Package Parts Ċ import Ġorg . jetbrains . kotlin . load . kotlin . incremental . Incremental Package Fragment Provider Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . progress . Progress Indicator And Compilation Canceled Status Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . Member Comparator Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Jvm ClassName Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . diagnostics . Mult if ile Class Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . diagnostics . Mult if ile Class Part Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . diagnostics . Other Origin Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . jvm Signature . Jvm Method Signature Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Descriptor Kind Filter Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Kt Scope Ċ import Ġorg . jetbrains . kotlin . serialization . de serialization . descriptors . Deserial ized Callable Member Descriptor Ċ import Ġorg . jetbrains . kotlin . serialization . de serialization . descriptors . Deserial ized Property Descriptor Ċ import Ġorg . jetbrains . kotlin . serialization . de serialization . descriptors . Deserial ized Simple Function Descriptor Ċ import Ġorg . jetbrains . org . object web . asm . Method Visitor Ċ import Ġorg . jetbrains . org . object web . asm . Op codes Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġjava . util .* Ċ Ċ public Ġclass ĠMult if ile Class Code gen ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstate : ĠGeneration State , ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġfiles : ĠCollection < Kt File >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfac ade Fq Name : ĠF q Name Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfac ade ClassType Ġ= ĠA sm Util . asm Type By Fq Name Without Inner Classes ( facade Fq Name ) ĊĊĠĠĠ Ġprivate Ġval Ġpackage Fragment Ġ= Ġget Only Package Fragment ( facade Fq Name . parent (), Ġfiles , Ġstate . binding Context ) ĊĊĠĠĠ Ġprivate Ġval Ġcompiled Package Fragment Ġ= Ġget Compiled Package Fragment ( facade Fq Name , Ġstate ) ĊĊĠĠĠ Ġprivate Ġval Ġpreviously Compiled Call ables Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compiled Package Fragment Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < Deserial ized Callable Member Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Deserial ized Call ables ( compiled Package Fragment ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Deserial ized Call ables ( compiled Package Fragment : ĠPackage Fragment Descriptor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Package Fragment . get Member Scope (). get Descriptors ( Descriptor Kind Filter . CALL ABLE S , ĠK t Scope . ALL _ NAME _ FILTER ). filter Is Instance < Deserial ized Callable Member Descriptor >() ĊĊĠĠĠ Ġpublic Ġval Ġpackage Parts Ġ= ĠPackage Parts ( facade Fq Name . parent (). asString ()) ĊĊĠĠĠ Ġprivate Ġval Ġclass Builder Ġ= ĠClass Builder On Demand Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorigin File Ġ= Ġfiles . first OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġactual Package Fragment Ġ= Ġpackage Fragment Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Package Fragment Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" No Ġpackage Ġfragment Ġfor Ġmult if ile Ġfac ade Ġ$ facade Fq Name ; Ġfiles : Ġ$ files ") ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Origin Ġ= ĠMult if ile Class ( origin File , Ġactual Package Fragment , Ġfac ade Fq Name ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Builder Ġ= Ġstate . factory . new Visitor ( declaration Origin , Ġfac ade ClassType , Ġfiles ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles With Call ables Ġ= Ġfiles . filter Ġ{ Ġit . declarations . any Ġ{ Ġit Ġis ĠK t Named Function Ġ|| Ġit Ġis ĠK t Property Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle SourceFile Ġ= Ġif Ġ( previous ly Compiled Call ables . isNotEmpty ()) Ġnull Ġelse Ġfiles With Call ables . single OrNull () ĊĊĠĠĠĠĠĠĠ Ġclass Builder . define Class ( single SourceFile , ĠOp codes . V 1 _ 6 , ĠF AC ADE _ CLASS _ ATTRIBUTES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade ClassType . internal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ" java / lang / Object ", ĠArray Util . EMPTY _ STRING _ ARRAY ) ĊĠĠĠĠĠĠĠ Ġif Ġ( single SourceFile Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Builder . visit Source ( single SourceFile . name , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclass Builder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġgenerate ( error Handler : ĠCompilation ErrorHandler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerate Callable Member Tasks Ġ= ĠHashMap < Callable Member Descriptor , Ġ() Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġval Ġpart Fq Names Ġ= Ġarray ListOf < Fq Name >() ĊĊĠĠĠĠĠĠĠ Ġgenerate Code For Source Files ( error Handler , Ġgenerate Callable Member Tasks , Ġpart Fq Names ) ĊĊĠĠĠĠĠĠĠ Ġgenerate Deleg ates To Previous ly Compiled Parts ( generate Callable Member Tasks , Ġpart Fq Names ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! generate Callable Member Tasks . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Mult if ile Facade Class ( generate Callable Member Tasks , Ġpart Fq Names ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Code For Source Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorHandler : ĠCompilation ErrorHandler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Callable Member Tasks : ĠMutable Map < Callable Member Descriptor , Ġ() Ġ-> ĠUnit >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart Fq Names : ĠMutable List < Fq Name > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Indicator And Compilation Canceled Status . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Part ( file , Ġgenerate Callable Member Tasks , Ġpart Fq Names ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv File Ġ= Ġfile . virtual File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorHandler . report Exception ( e , Ġif Ġ( v File Ġ== Ġnull ) Ġ" no Ġfile " Ġelse Ġv File . url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiagnostic Utils . throw If Running On Server ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Application Manager . getApplication (). is Internal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// no inspection ĠCall To Print StackTrace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Mult if ile Facade Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks : ĠMap < Callable Member Descriptor , Ġ() Ġ-> ĠUnit >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart Fq Names : ĠList < Fq Name > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMember Code gen . generate ModuleName Field ( state , Ġclass Builder ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( member Ġin Ġtasks . keySet (). sorted With ( Member Comparator . INSTANCE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks [ member ] !! () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite Kotlin Mult if ile Facade Annotation IfNeeded ( part Fq Names ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġgenerate Class Or Object ( class Or Object : ĠK t Class Or Object , Ġpackage Part Context : ĠField Owner Context < Package Fragment Descriptor >) Ġ{ ĊĠĠĠĠĠĠĠ ĠMember Code gen . gen Class Or Object ( package Part Context , Ġclass Or Object , Ġstate , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Part ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠK t File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Callable Member Tasks : ĠMutable Map < Callable Member Descriptor , Ġ() Ġ-> ĠUnit >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart Fq Names : ĠMutable List < Fq Name > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Fragment Ġ= Ġthis . package Fragment Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" File Ġpart Ġ$ file Ġof Ġ$ facade Fq Name : Ġno Ġpackage Ġfragment ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġgenerate Part Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġpart Class Info Ġ= Ġstate . file Classes Provider . getFile Class Info ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġpart Type Ġ= ĠA sm Util . asm Type By Fq Name Without Inner Classes ( part Class Info . file Class Fq Name ) ĊĠĠĠĠĠĠĠ Ġval Ġpart Context Ġ= Ġstate . root Context . into Mult if ile Class Part ( package Fragment , Ġfac ade ClassType , Ġpart Type , Ġfile ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġfile . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠK t Property Ġ|| Ġdeclaration Ġis ĠK t Named Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Part Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( declaration Ġis ĠK t Class Or Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . generate Declared Class Filter . should Generate Class ( declaration )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Class Or Object ( declaration , Ġpart Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( declaration Ġis ĠK t Script ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS CRIPT : Ġgenerate Ġscript Ġcode , Ġshould Ġbe Ġseparate Ġexecution Ġbranch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . generate Declared Class Filter . should Generate Script ( declaration )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScript Code gen . create Script Code gen ( declaration , Ġstate , Ġpart Context ). generate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ(! generate Part Ġ|| Ġ! state . generate Declared Class Filter . should Generate Package Part ( file )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġpart Fq Names . add ( part Class Info . file Class Fq Name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġpart Type . internal Name ĊĠĠĠĠĠĠĠ Ġpackage Parts . parts . add ( name . substring ( name . lastIndexOf ('/') Ġ+ Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġstate . factory . new Visitor ( Mult if ile Class Part ( file , Ġpackage Fragment , Ġfac ade Fq Name ), Ġpart Type , Ġfile ) ĊĊĠĠĠĠĠĠĠ ĠMult if ile Class Part Code gen ( builder , Ġfile , Ġpart Type , Ġfac ade ClassType , Ġpart Context , Ġstate ). generate () ĊĊĠĠĠĠĠĠĠ Ġval Ġfac ade Context Ġ= Ġstate . root Context . into Mult if ile Class ( package Fragment , Ġfac ade ClassType , Ġpart Type ) ĊĠĠĠĠĠĠĠ Ġval Ġmember Code gen Ġ= Ġcreate Code gen For Part Of Mult if ile Facade ( facade Context ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġfile . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠK t Named Function Ġ|| Ġdeclaration Ġis ĠK t Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġstate . binding Context . get ( Binding Context . DECL AR ATION _ TO _ DESCRIPTOR , Ġdeclaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( descriptor Ġis ĠCallable Member Descriptor ) Ġ{ Ġ" Expected Ġcallable Ġmember , Ġwas Ġ" Ġ+ Ġdescriptor Ġ+ Ġ" Ġfor Ġ" Ġ+ Ġdeclaration . text Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Vis ibilities . is Private (( descriptor Ġas ĠCallable Member Descriptor ). visibility )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Callable Member Tasks . put ( descriptor , Ġ{ Ġmember Code gen . gen Function Or Property ( declaration ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Deleg ates To Previous ly Compiled Parts ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Callable Member Tasks : ĠMutable Map < Callable Member Descriptor , Ġ() Ġ-> ĠUnit >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart Fq Names : ĠMutable List < Fq Name > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( compiled Package Fragment Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġpart Fq Names . addAll ( compiled Package Fragment . parts Names . map Ġ{ ĠJ vm ClassName . by Internal Name ( it ). fq Name For ClassName Without Dollar s Ġ}) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( callable Ġin Ġpreviously Compiled Call ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart Fq Name Ġ= ĠJ vm File Class Util . get Part Fq Name For Deserial ized Callable ( callable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart Type Ġ= ĠA sm Util . asm Type By Fq Name Without Inner Classes ( part Fq Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Callable Member Tasks [ callable ] Ġ= Ġ{ Ġgenerate Delegate To Compiled Member ( callable , Ġcompiled Package Fragment , Ġpart Type ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Delegate To Compiled Member ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmember : ĠCallable Member Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Package Fragment : ĠPackage Fragment Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart Type : ĠType ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġstate . root Context . into Mult if ile Class ( compiled Package Fragment , Ġfac ade ClassType , Ġpart Type ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmember Code gen Ġ= Ġcreate Code gen For Part Of Mult if ile Facade ( context ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( member ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeserial ized Simple Function Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember Code gen . function Code gen . generate Method ( Other Origin ( member ), Ġmember , ĠDelegate To Compiled Member Generation Strategy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember Code gen . function Code gen . generate Default IfNeeded ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . into Function ( member ), Ġmember , ĠOwner Kind . PACKAGE , ĠDefault Parameter Value Loader . DEFAULT , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember Code gen . function Code gen . generate Over load sWith Default Values ( null , Ġmember , Ġmember ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeserial ized Property Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember Code gen . property Code gen . generate In Package Facade ( member ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Unexpected Ġmember : Ġ" Ġ+ Ġmember ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠDelegate To Compiled Member Generation Strategy Ġ: ĠFunction Generation Strategy () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate Body ( mv : ĠMethod Visitor , Ġframe Map : ĠFrame Map , Ġsignature : ĠJ vm Method Signature , Ġcontext : ĠMethod Context , Ġparent Code gen : ĠMember Code gen <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" should n 't Ġbe Ġcalled ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Kotlin Mult if ile Facade Annotation IfNeeded ( part Fq Names : ĠList < Fq Name >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state . class Builder Mode Ġ!= ĠClass Builder Mode . FULL ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( files . any Ġ{ Ġit . is Script Ġ}) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġav Ġ= Ġclass Builder . new Annotation ( Asm Util . asm Desc By Fq Name Without Inner Classes ( Jvm Annotation Names . K OT LIN _ MULTI FILE _ CLASS ), Ġtrue ) ĊĠĠĠĠĠĠĠ ĠJ vm Code gen Util . write Ab i Version ( av ) ĊĠĠĠĠĠĠĠ ĠJ vm Code gen Util . write ModuleName ( av , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpart Internal Names Ġ= Ġpart Fq Names . map Ġ{ ĠJ vm ClassName . by Fq Name Without Inner Classes ( it ). internal Name Ġ}. sorted () ĊĠĠĠĠĠĠĠ Ġval Ġar v Ġ= Ġav . visit Array ( Jvm Annotation Names . FILE _ PART _ CLASS _ NAMES _ FIELD _ NAME ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( internal Name Ġin Ġpart Internal Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġar v . visit ( null , Ġinternal Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġar v . visit End () ĊĊĠĠĠĠĠĠĠ Ġav . visit End () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Code gen For Part Of Mult if ile Facade ( facade Context : ĠField Owner Context < *> ): ĠMember Code gen < Kt File > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠMember Code gen < Kt File >( state , Ġnull , Ġfac ade Context , Ġnull , Ġclass Builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate Declaration () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate Body () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate Kotlin Annotation () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġdone () Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Builder . done () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠF AC ADE _ CLASS _ ATTRIBUTES Ġ= ĠOp codes . ACC _ PUBLIC Ġor ĠOp codes . ACC _ FINAL ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Only Package Fragment ( package Fq Name : ĠF q Name , Ġfiles : ĠCollection < Kt File >, Ġbinding Context : ĠBinding Context ): ĠPackage Fragment Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragments Ġ= ĠSmart List < Package Fragment Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġbinding Context . get ( Binding Context . FILE _ TO _ PACKAGE _ FRAGMENT , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( fragment Ġ!= Ġnull ) Ġ{ Ġ" package Ġfragment Ġis Ġnull Ġfor Ġ" Ġ+ Ġfile Ġ+ Ġ"\ n " Ġ+ Ġfile . text Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( package Fq Name Ġ== Ġfragment !!. fq Name ) Ġ{ Ġ" expected Ġpackage Ġfq Ġname : Ġ" Ġ+ Ġpackage Fq Name Ġ+ Ġ", Ġactual : Ġ" Ġ+ Ġfragment . fq Name Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! fragments . contains ( fragment )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragments . add ( fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragments . size () Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" More Ġthan Ġone Ġpackage Ġfragment , Ġfiles : Ġ$ files Ġ| Ġfragments : Ġ$ fragments ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragments . first OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Compiled Package Fragment ( facade Fq Name : ĠF q Name , Ġstate : ĠGeneration State ): ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIncrement al Package Fragment Provider . Incremental Package Fragment . Incremental Mult if ile Class Package Fragment ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Incremental Compilation . isEnabled ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Fq Name Ġ= Ġfac ade Fq Name . parent () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincremental Package Fragment Ġ= Ġstate . module . get Package ( package Fq Name ). fragments . first OrNull Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġis ĠIncrement al Package Fragment Provider . Incremental Package Fragment Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . target Ġ== Ġstate . target Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠIncrement al Package Fragment Provider . Incremental Package Fragment ? ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġincremental Package Fragment ?. get Package Fragment For Mult if ile Class ( facade Fq Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }