/* Ċ Ġ* Ġ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 . util . Array Util Ċ import Ġorg . jetbrains . kotlin . backend . common . brid ges . find Implementation From Interface Ċ import Ġorg . jetbrains . kotlin . backend . common . brid ges . first Super Method From Kotlin Ċ import Ġorg . jetbrains . kotlin . codegen . context . Class Context Ċ import Ġorg . jetbrains . kotlin . codegen . state . Generation State Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Class Descriptor Impl Ċ import Ġorg . jetbrains . kotlin . load . java . Jvm Ab i Ċ import Ġorg . jetbrains . kotlin . load . java . Jvm Annotation Names Ċ import Ġorg . jetbrains . kotlin . load . java . Jvm Annotation Names . K OT LIN _ INTERFACE _ DEFAULT _ IMP LS Ċ import Ġorg . jetbrains . kotlin . load . java . descriptors . Java MethodDescriptor Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Or Object Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor To Source Utils Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . diagnostics . Deleg ation To Trait Impl Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . diagnostics . Jvm Declaration Origin Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . jvm Signature . Jvm Method Signature Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Kt Scope Ċ import Ġorg . jetbrains . org . object web . asm . Annotation Visitor Ċ import Ġorg . jetbrains . org . object web . asm . Field Visitor Ċ import Ġorg . jetbrains . org . object web . asm . Method Visitor Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ACC _ FINAL Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . ACC _ PUBLIC Ċ import Ġorg . jetbrains . org . object web . asm . Op codes . V 1 _ 6 Ċ import Ġjava . util .* Ċ Ċ public Ġclass ĠInterface Impl Body Code gen ( ĊĠĠĠĠĠĠĠ Ġa Class : ĠK t Class Or Object , ĊĠĠĠĠĠĠĠ Ġcontext : ĠClass Context , ĊĠĠĠĠĠĠĠ Ġv : ĠClass Builder , ĊĠĠĠĠĠĠĠ Ġstate : ĠGeneration State , ĊĠĠĠĠĠĠĠ Ġparent Code gen : ĠMember Code gen < *> ? Ċ ) Ġ: ĠClass Body Code gen ( aClass , Ġcontext , ĠInterface Impl Body Code gen . Interface Impl Class Builder ( v ), Ġstate , Ġparent Code gen ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġis Anything Generated : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( v Ġas ĠInterface Impl Class Builder ). is Anything Generated ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Declaration () Ġ{ ĊĠĠĠĠĠĠĠ Ġv . define Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Class , ĠV 1 _ 6 , ĠACC _ PUBLIC Ġor ĠACC _ FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Mapper . map Default Imp ls ( descriptor ). internal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ" java / lang / Object ", ĠArray Util . EMPTY _ STRING _ ARRAY ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġv . visit Source ( my Class . get Containing File (). getName (), Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclass For Inner Class Record (): ĠClass Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Anything Generated ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( Descriptor Utils . is Local ( descriptor )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Impl Ġ= ĠClass Descriptor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor , ĠName . identifier ( Jvm Ab i . DEFAULT _ IMP LS _ CLASS _ NAME ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod ality . FINAL , ĠCollections . emptyList (), ĠSource Element . NO _ SOURCE ) ĊĊĠĠĠĠĠĠĠ Ġclass Descriptor Impl . initialize ( Kt Scope . Empty , Ġempty Set (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġclass Descriptor Impl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Synt hetic Parts () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( member Descriptor Ġin Ġdescriptor . getDefault Type (). get Member Scope (). getAll Descriptors ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member Descriptor Ġ! is ĠCallable Member Descriptor ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member Descriptor . get Kind (). is Real ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member Descriptor . get Visibility () Ġ== ĠVis ibilities . IN VISIBLE _ FA KE ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member Descriptor . get Modal ity () Ġ== ĠMod ality . AB STR ACT ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplementation Ġ= Ġfind Implementation From Interface ( member Descriptor ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġimplementation Ġis Ġlocated Ġin Ġa ĠJava Ġinterface , Ġit Ġwill Ġbe Ġinherited Ġvia Ġnormal ĠJava Ġrules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( implementation Ġis ĠJava MethodDescriptor ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcreate Ġa Ġcopy Ġof Ġthe Ġfunction Ġwith Ġkind Ġ= ĠDECL AR ATION Ġso Ġthat ĠFunction Code gen Ġwill Ġgenerate Ġits Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġmember Descriptor . copy ( member Descriptor . get Containing Declaration (), ĠMod ality . OPEN , Ġmember Descriptor . get Visibility (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Member Descriptor . Kind . DECL AR ATION , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member Descriptor Ġis ĠFunction Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Deleg ation To Super Trait Impl ( copy Ġas ĠFunction Descriptor , Ġimplementation Ġas ĠFunction Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( member Descriptor Ġis ĠProperty Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation Ġas ĠProperty Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġ( copy Ġas ĠProperty Descriptor ). get Getter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimpl Getter Ġ= Ġimplementation . get Getter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getter Ġ!= Ġnull Ġ&& Ġimpl Getter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Deleg ation To Super Trait Impl ( getter , Ġimpl Getter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġcopy . get Setter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimpl Setter Ġ= Ġimplementation . get Setter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( setter Ġ!= Ġnull Ġ&& Ġimpl Setter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Deleg ation To Super Trait Impl ( setter , Ġimpl Setter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Deleg ation To Super Trait Impl ( descriptor : ĠFunction Descriptor , Ġimplementation : ĠFunction Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelegate To Ġ= Ġfirst Super Method From Kotlin ( descriptor , Ġimplementation ) Ġas ĠFunction Descriptor ? Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan 't Ġcall Ġsuper Ġmethods Ġfrom ĠJava Ġ 1 . 8 Ġinterfaces Ġbecause Ġthat Ġrequires ĠIN V OK ES PE CIAL Ġwhich Ġis Ġforbidden Ġfrom ĠT Impl Ġclass ĊĠĠĠĠĠĠĠ Ġif Ġ( delegate To Ġis ĠJava MethodDescriptor ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġfunction Code gen . generate Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDeleg ation To Trait Impl ( Descriptor To Source Utils . descriptor To Declaration ( descriptor ), Ġdescriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠFunction Generation Strategy . Code gen Based < Function Descriptor >( state , Ġdescriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Generate Body ( codegen : ĠExpression Code gen , Ġsignature : ĠJ vm Method Signature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Ġ= Ġcodegen . v ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtype Mapper . map To Callable Method ( delegate To , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Parameters Ġ= Ġsignature . getValue Parameters () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Parameters Ġ= Ġmethod . getValue Parameters () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Parameters . size () Ġ!= Ġcal lee Parameters . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Method Ġfrom Ġsuper Ġinterface Ġhas Ġa Ġdifferent Ġsignature .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġmethod :\ n % s \ n % s \ n % s \ n Super Ġmethod :\ n % s \ n % s \ n % s ". format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Descriptor , Ġsignature , Ġmy Parameters , Ġdelegate To , Ġmethod , Ġcal lee Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġk Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġcal lee Parameters . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġmy Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġparameter . get Asm Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStack Value . local ( k , Ġtype ). put ( it . next (). get Asm Type (), Ġiv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk Ġ+= Ġtype . getSize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . gen Invoke Instruction ( iv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStack Value . coerce ( method . returnType , Ġsignature . get ReturnType (), Ġiv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv . are turn ( signature . get ReturnType ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Kotlin Annotation () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( v Ġas ĠInterface Impl Class Builder ). stop Count ing () ĊĊĠĠĠĠĠĠĠ Ġval Ġav Ġ= Ġv . new Annotation ( Asm Util . asm Desc By Fq Name Without Inner Classes ( K OT LIN _ INTERFACE _ DEFAULT _ IMP LS ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġav . visit ( Jvm Annotation Names . VERSION _ FIELD _ NAME , ĠJ vm Ab i . VERSION . toArray ()) ĊĠĠĠĠĠĠĠ Ġav . visit End () ĊĠĠĠĠĠĠĠ ĠA sm Util . write Kotlin Synt hetic Class Annotation ( v , Ġstate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdone () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . done () ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Anything Generated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . factory . remove Classes ( set Of ( type Mapper . map Default Imp ls ( descriptor ). internal Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠInterface Impl Class Builder ( private Ġval Ġv : ĠClass Builder ) Ġ: ĠDeleg ating Class Builder () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġshould Count : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġis Anything Generated : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠĠĠĠĠ Ġfun Ġstop Count ing () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Count Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Delegate () Ġ= Ġv ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin : ĠJ vm Declaration Origin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions : ĠArray < out ĠString >? ĊĠĠĠĠĠĠĠ Ġ): ĠMethod Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Anything Generated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . new Method ( origin , Ġaccess , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ