/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . ĠThe ĠMe ow ool ĠOrganization ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ* ĠIn Ġaddition , Ġif Ġyou Ġmodified Ġthe Ġproject , Ġyou Ġmust Ġinclude Ġthe ĠMe ow ool Ċ Ġ* Ġorganization ĠURL Ġin Ġyour Ġcode Ġfile : Ġhttps :// github . com / me ow ool Ċ Ġ* Ċ Ġ* Ġå¦Ĥæŀľ æĤ¨ ä¿®æĶ¹ äºĨ æŃ¤ é¡¹çĽ® ï¼Į åĪĻ å¿ħé¡» ç¡® ä¿Ŀ æºĲ æĸĩä»¶ ä¸Ń åĮħåĲ« ĠMe ow ool Ġ ç»Ħç»ĩ ĠURL : Ġhttps :// github . com / me ow ool Ċ Ġ*/ Ċ @ file : Suppress (" NAME _ SH ADO WING ", Ġ" Remove Red undant Spread Operator ") Ċ Ċ package Ġcom . me ow ool . sw ee kt . info Ċ Ċ import Ġcom . me ow ool . sw ee kt . Abstract Ir Transformer Ċ import Ġcom . me ow ool . sw ee kt . Sw ee kt Names . Content Equals Ċ import Ġcom . me ow ool . sw ee kt . Sw ee kt Names . Full Info Synt hetic Ċ import Ġcom . me ow ool . sw ee kt . Sw ee kt Names . Info Ċ import Ġcom . me ow ool . sw ee kt . Sw ee kt Names . Info In visible Ċ import Ġcom . me ow ool . sw ee kt . Sw ee kt Synt hetic Declaration Origin Ċ import Ġcom . me ow ool . sw ee kt . if Null Ċ import Ġcom . me ow ool . sw ee kt . info . Info Class Descriptor Resolver . Copy FunctionName Ċ import Ġcom . me ow ool . sw ee kt . let Ċ import Ġorg . jetbrains . kotlin . backend . common . Class Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Generation Extension Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Plugin Context Ċ import Ġorg . jetbrains . kotlin . backend . common . lower Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . ir Not Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Ċ import Ġorg . jetbrains . kotlin . descriptors . Descriptor Vis ibilities Ċ import Ġorg . jetbrains . kotlin . ir . Obsolete Descriptor Based API Ċ import Ġorg . jetbrains . kotlin . ir . builders . Ir Builder With Scope Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . Ir Function Builder Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir As Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Block Body Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Call Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Call Op Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Concat Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Eq eq eq Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Get Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir If Null Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir If Then Return False Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir If Then Return True Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Int Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Not Equals Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Not Is Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Return Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Return True Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir String Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Temporary Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Constructor Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Declaration Origin Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Module Fragment Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Property Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Simple Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Variable Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Body Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . overrides . is Over rid able Member Or Accessor Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Value Parameter Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . classifier OrNull Ċ import Ġorg . jetbrains . kotlin . ir . types . isArray Ċ import Ġorg . jetbrains . kotlin . ir . types . is Nullable Ċ import Ġorg . jetbrains . kotlin . ir . util . SYN TH ET IC _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . util . construct ors Ċ import Ġorg . jetbrains . kotlin . ir . util . default Type Ċ import Ġorg . jetbrains . kotlin . ir . util . find Declaration Ċ import Ġorg . jetbrains . kotlin . ir . util . functions Ċ import Ġorg . jetbrains . kotlin . ir . util . getAnnotation Ċ import Ġorg . jetbrains . kotlin . ir . util . getSimple Function Ċ import Ġorg . jetbrains . kotlin . ir . util . is Fake Override Ċ import Ġorg . jetbrains . kotlin . ir . util . is Primitive Array Ċ import Ġorg . jetbrains . kotlin . ir . util . kotlin Fq Name Ċ import Ġorg . jetbrains . kotlin . ir . util . parent As Class Ċ import Ġorg . jetbrains . kotlin . ir . util . parent Class OrNull Ċ import Ġorg . jetbrains . kotlin . ir . util . primary Constructor Ċ import Ġorg . jetbrains . kotlin . ir . util . properties Ċ import Ġorg . jetbrains . kotlin . ir . util . render Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . fq Name Safe Ċ Ċ /** Ċ Ġ* Ġ@ author Ġ åĩ Ľ Ġ( R in Or z ) Ċ Ġ*/ Ċ @ Opt In ( Obsolete Descriptor Based API :: class ) Ċ class ĠInfo Class Generation ( val Ġconfiguration : ĠCompiler Configuration ) Ġ: ĠIr Generation Extension Ġ{ ĊĠ Ġoverride Ġfun Ġgenerate ( module Fragment : ĠIr Module Fragment , Ġplugin Context : ĠIr Plugin Context ) Ġ= ĊĠĠĠ ĠTransformer ( plugin Context ). lower ( module Fragment ) ĊĊĠ Ġprivate Ġinner Ġclass ĠTransformer ( context : ĠIr Plugin Context ) Ġ: ĊĠĠĠ ĠAbstract Ir Transformer ( context , Ġconfiguration ), ĊĠĠĠ ĠClass Lower ing Pass Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠ Ġval Ġinfo Ġ= Ġir Class . getAnnotation ( Info )?. let (:: Info ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġval Ġproperties Ġ= Ġir Class . collect Properties ( info ) ĊĠĠĠĠĠ Ġval Ġfunctions Ġ= Ġir Class . functions ĊĠĠĠĠĠ Ġval Ġconstructor Entry Ġ= Ġir Class . primary Constructor Ġ?: Ġir Class . construct ors . single OrNull () Ġ?: Ġreturn ĊĊĠĠĠĠĠ Ġ// Ġoverride Ġfun Ġcopy (... ): Ġ? ĊĠĠĠĠĠ Ġif Ġ( info . generate Copy ) Ġcollect Copy Parameters ( constructor Entry , Ġproperties ). also Ġ{ Ġcopy Parameters Ġ-> ĊĠĠĠĠĠĠĠ ĠCopy Generation ( ir Class , Ġconstructor Entry , Ġcopy Parameters ) ĊĠĠĠĠĠĠĠĠĠ Ġ. generate If Un define ( functions , Ġproperties ) Ġ{ Ġis Copy ( copy Parameters ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean ĊĠĠĠĠĠ Ġif Ġ( info . generate Equals ) ĠEquals Generation ( ir Class , Ġinfo . call Super Equals ) ĊĠĠĠĠĠĠĠ Ġ. generate If Un define ( functions , Ġproperties , Ġallow Empty Properties Ġ= Ġfalse ) Ġ{ Ġis Equals () Ġ} ĊĊĠĠĠĠĠ Ġ// Ġoverride Ġfun ĠhashCode (): ĠInt ĊĠĠĠĠĠ Ġif Ġ( info . generate HashCode ) ĠHash Code Generation ( ir Class , Ġinfo . call Super HashCode ) ĊĠĠĠĠĠĠĠ Ġ. generate If Un define ( functions , Ġproperties , Ġallow Empty Properties Ġ= Ġfalse ) Ġ{ Ġis HashCode () Ġ} ĊĊĠĠĠĠĠ Ġ// Ġoverride Ġfun ĠtoString (): ĠString ĊĠĠĠĠĠ Ġif Ġ( info . generate ToString ) ĠToString Generation ( ir Class ) ĊĠĠĠĠĠĠĠ Ġ. generate If Un define ( functions , Ġproperties ) Ġ{ Ġis ToString () Ġ} ĊĊĠĠĠĠĠ Ġ// Ġoperator Ġfun Ġcomponent N (): Ġ? ĊĠĠĠĠĠ Ġif Ġ( info . generate Component N ) Ġproperties . toList (). filter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo In visible Ġ= Ġit . getAnnotation ( Info In visible )?. let (:: Info In visible ) ĊĠĠĠĠĠĠĠ Ġinfo In visible Ġ== Ġnull Ġ|| Ġinfo In visible . generate Component N ĊĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Ġ{ Ġ" generate Component N Ġfor Ġ[ ${ it . join ToString Ġ{ Ġit . name . asString () Ġ}} ]" Ġ} ĊĠĠĠĠĠ Ġ}. forEach Indexed Ġ{ Ġindex , Ġproperty Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ ĠComponent N Generation ( ir Class , Ġn , Ġproperty ) ĊĠĠĠĠĠĠĠĠĠ Ġ. generate If Un define ( functions , Ġempty Sequence ()) Ġ{ Ġis Component N ( n ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFunction Generation . generate If Un define ( ĊĠĠĠĠĠ Ġfunctions : ĠSequence < Ir Simple Function >, ĊĠĠĠĠĠ Ġproperties : ĠSequence < Ir Property >, ĊĠĠĠĠĠ Ġallow Empty Properties : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠ Ġis Same Signature : ĠIr Simple Function . () Ġ-> ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( val Ġfunction Ġ= Ġfunctions . single OrNull Ġ{ Ġit . is Same Signature () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġgenerate ( properties , Ġallow Empty Properties ) ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġfunction Ġwith Ġthe Ġsame Ġsignature Ġis Ġmanually Ġdefined , Ġit Ġwill Ġnot Ġbe Ġgenerated ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( function . is Fake Override Ġ|| Ġfunction . body Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġir Class . declarations . remove ( function ) ĊĠĠĠĠĠĠĠĠĠ Ġgenerate ( properties , Ġallow Empty Properties ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġgenerate ( properties , Ġallow Empty Properties , Ġonly Proxy Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Class . collect Properties ( info : ĠInfo ) Ġ= Ġproperties . filter Ġ{ ĊĠĠĠĠĠ Ġif Ġ( info . join Private Properties . not () Ġ&& ĠDescriptor Vis ibilities . is Private ( it . visibility )) Ġreturn @ filter Ġfalse ĊĠĠĠĠĠ Ġif Ġ( info . join Primary Properties . not () Ġ&& Ġit . is Primary Constructor Parameter ) Ġreturn @ filter Ġfalse ĊĠĠĠĠĠ Ġif Ġ( info . join Body Properties . not () Ġ&& Ġit . is Class Body Property ) Ġreturn @ filter Ġfalse ĊĠĠĠĠĠ Ġit . origin Ġ== ĠIr Declaration Origin . DEFINED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Copy Parameters ( ĊĠĠĠĠĠ Ġconstructor : ĠIr Constructor , ĊĠĠĠĠĠ Ġproperties : ĠSequence < Ir Property > ĊĠĠĠ Ġ): ĠList < Function Parameter Id > Ġ{ ĊĠĠĠĠĠ Ġ// ĠFor Ġexample : ĊĠĠĠĠĠ Ġ// ĠĠ Ġclass ĠFoo ( required : ĠInt , Ġprivate Ġval Ġis Init : ĠBoolean ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠĠĠĠ Ġlateinit Ġvar Ġname : ĠString ĊĠĠĠĠĠ Ġ// ĊĠĠĠĠĠ Ġ// ĠThe Ġ' copy ' Ġfunction Ġsignature : ĊĠĠĠĠĠ Ġ// ĠĠ Ġfun Ġcopy ( ĊĠĠĠĠĠ Ġ// ĠĠĠĠ Ġrequired : ĠInt , ĊĠĠĠĠĠ Ġ// ĠĠĠĠ Ġis Init : ĠBoolean Ġ= Ġthis . is Init , ĊĠĠĠĠĠ Ġ// ĠĠĠĠ Ġname : ĠString Ġ= Ġthis . name ĊĠĠĠĠĠ Ġ// ĠĠ Ġ): ĠFoo ĊĠĠĠĠĠ Ġ// ĊĠĠĠĠĠ Ġ// Ġ================================================================= ================ ĊĠĠĠĠĠ Ġ// Ġ" Non - property " Ġparameters Ġin Ġthe Ġconstructor Ġare Ġtreated Ġas Ġrequired Ġparameters ĊĠĠĠĠĠ Ġval Ġrequired Params Ġ= Ġconstructor . value Parameters . filter Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠ Ġproperties . none Ġ{ Ġparam . name Ġ== Ġit . name Ġ} ĊĠĠĠĠĠ Ġ}. map Ġ{ ĠFunction Parameter Id ( it . name , Ġit . type ) Ġ} ĊĊĠĠĠĠĠ Ġval Ġbody Properties Ġ= Ġproperties . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo In visible Ġ= Ġit . getAnnotation ( Info In visible )?. let (:: Info In visible ) ĊĠĠĠĠĠĠĠ Ġinfo In visible Ġ== Ġnull Ġ|| Ġinfo In visible . generate Copy ĊĠĠĠĠĠ Ġ}. map Ġ{ ĠFunction Parameter Id ( it . name , Ġit . type ) Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġrequired Params Ġ+ Ġbody Properties ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Function . is Copy ( except ed Parameters : ĠList < Function Parameter Id >): ĠBoolean Ġ= Ġname Ġ== ĠCopy FunctionName Ġ&& ĊĠĠĠĠĠ ĠreturnType Ġ== Ġparent As Class . default Type Ġ&& ĊĠĠĠĠĠ Ġextension Receiver Parameter Ġ== Ġnull Ġ&& Ġtype Parameters . isEmpty () Ġ&& ĊĠĠĠĠĠ Ġvalue Parameters . map Ġ{ Ġit . type Ġ} Ġ== Ġexcept ed Parameters . map Ġ{ Ġit . type Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Function . is HashCode (): ĠBoolean Ġ= Ġname . asString () Ġ== Ġ" hashCode " Ġ&& ĠreturnType Ġ== Ġir Built Ins . int Type Ġ&& ĊĠĠĠĠĠ Ġextension Receiver Parameter Ġ== Ġnull Ġ&& Ġvalue Parameters . isEmpty () Ġ&& Ġtype Parameters . isEmpty () ĊĊĠĠĠ Ġprivate Ġfun ĠIr Function . is Equals (): ĠBoolean Ġ= Ġname . asString () Ġ== Ġ" equals " Ġ&& ĠreturnType Ġ== Ġir Built Ins . boolean Type Ġ&& ĊĠĠĠĠĠ Ġextension Receiver Parameter Ġ== Ġnull Ġ&& Ġtype Parameters . isEmpty () Ġ&& ĊĠĠĠĠĠ Ġvalue Parameters . single OrNull ()?. type Ġ== Ġir Built Ins . any N Type ĊĊĠĠĠ Ġprivate Ġfun ĠIr Function . is ToString (): ĠBoolean Ġ= Ġname . asString () Ġ== Ġ" toString " Ġ&& ĠreturnType Ġ== Ġir Built Ins . string Type Ġ&& ĊĠĠĠĠĠ Ġextension Receiver Parameter Ġ== Ġnull Ġ&& Ġtype Parameters . isEmpty () Ġ&& Ġvalue Parameters . isEmpty () ĊĊĠĠĠ Ġprivate Ġfun ĠIr Function . is Component N ( number : ĠInt ): ĠBoolean Ġ= Ġname . asString () Ġ== Ġ" component $ number " Ġ&& ĊĠĠĠĠĠ Ġextension Receiver Parameter Ġ== Ġnull Ġ&& Ġtype Parameters . isEmpty () Ġ&& Ġvalue Parameters . isEmpty () ĊĊĠĠĠ Ġprivate Ġabstract Ġinner Ġclass ĠFunction Generation ( ĊĠĠĠĠĠ Ġval Ġir Class : ĠIr Class , ĊĠĠĠĠĠ Ġval Ġfunction Name : ĠString , ĊĠĠĠĠĠ Ġval Ġfunction Proxy Name : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġprivate Ġval ĠreturnType : ĠIr Type , ĊĠĠĠĠĠ Ġprivate Ġvar arg Ġval Ġparameters : ĠFunction Parameter Id , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġir Class : ĠIr Class , ĊĠĠĠĠĠĠĠ Ġfunction Name : ĠString , ĊĠĠĠĠĠĠĠ Ġfunction Proxy Name : ĠString , ĊĠĠĠĠĠĠĠ ĠreturnType : ĠIr Type , ĊĠĠĠĠĠĠĠ Ġvar arg Ġparameters : ĠIr Type , ĊĠĠĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġir Class , ĊĠĠĠĠĠĠĠ Ġfunction Name , ĊĠĠĠĠĠĠĠ Ġfunction Proxy Name , ĊĠĠĠĠĠĠĠ ĠreturnType , ĊĠĠĠĠĠĠĠ Ġ* parameters . map Indexed Ġ{ Ġindex , Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠFunction Parameter Id ( Name . identifier (" arg $ index "), Ġtype ) ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array (), ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġir Class : ĠIr Class , ĊĠĠĠĠĠĠĠ Ġfunction Name : ĠString , ĊĠĠĠĠĠĠĠ Ġfunction Proxy Name : ĠString , ĊĠĠĠĠĠĠĠ ĠreturnType : ĠIr Type , ĊĠĠĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġir Class , ĊĠĠĠĠĠĠĠ Ġfunction Name , ĊĠĠĠĠĠĠĠ Ġfunction Proxy Name , ĊĠĠĠĠĠĠĠ ĠreturnType , ĊĠĠĠĠĠĠĠ Ġ* empty Array < Ir Type >(), ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġval Ġir Type Ġ= Ġir Class . default Type ĊĊĠĠĠĠĠ Ġfun Ġgenerate ( properties : ĠSequence < Ir Property >, Ġallow Empty Properties : ĠBoolean Ġ= Ġtrue , Ġonly Proxy : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġproperties . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġinfo In visible Ġ= Ġit . getAnnotation ( Info In visible )?. let (:: Info In visible ) ĊĠĠĠĠĠĠĠĠĠ Ġinfo In visible Ġ== Ġnull Ġ|| Ġis Join ( info In visible ) ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġval Ġproxy Ġ= Ġgenerate Proxy ( properties ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( allow Empty Properties . not () Ġ&& Ġproperties . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( only Proxy ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġadd Function ( function Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis Operator Ġ= Ġis Operator () ĊĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PUBLIC ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġfunc Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġfunc . over ridden Symbols Ġ= Ġir Class . find Over rid en Function Symbols Ġ{ Ġit . is Same Signature () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġfunc . body Ġ= Ġfunc . build Ir Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( proxy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠFunction Body Builder ( this , Ġfunc ). body ( properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġir Return Expr Body ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( proxy ). also Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . dispatch Receiver Ġ= Ġthis Expr ( func ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . value Parameters . forEach Indexed Ġ{ Ġindex , Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . put Value Argument ( index , Ġir Get ( param )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġfun Ġgenerate Proxy ( properties : ĠMutable List < Ir Property >): ĠIr Simple Function ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠIr Function . is Proxy Function ( except ed Name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġname . asString () Ġ== Ġexcept ed Name Ġ&& Ġvalue Parameters . map Ġ{ Ġit . type Ġ} Ġ== Ġparameters . map Ġ{ Ġit . type Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġproxy Name Ġ= Ġfunction Proxy Name Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġir Class . find Declaration < Ir Function > Ġ{ Ġfunc Ġ-> Ġfunc . is Proxy Function ( proxy Name ) Ġ&& Ġfunc . is Fake Override Ġ} ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġir Class . declarations Ġ-= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġadd Function ( proxy Name ). also Ġ{ Ġfunc Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġfunc . over ridden Symbols Ġ= Ġir Class . find Over rid en Function Symbols Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . is Proxy Function ( proxy Name ) Ġ&& Ġit . is Over rid able Member Or Accessor () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Class OrNull ?. kotlin Fq Name Ġ== ĠFull Info Synt hetic ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġfunc . body Ġ= Ġfunc . build Ir Ġ{ ĠFunction Body Builder ( this , Ġfunc ). body ( properties ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprivate Ġfun Ġadd Function ( ĊĠĠĠĠĠĠĠ Ġname Identifier : ĠString , ĊĠĠĠĠĠĠĠ Ġbuilder : ĠIr Function Builder . () Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠ Ġ) Ġ= Ġir Class . addFunction Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier ( name Identifier ) ĊĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġthis @ Function Generation . returnType ĊĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠSYN TH ET IC _ OFFSET ĊĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠSYN TH ET IC _ OFFSET ĊĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠ Ġbuilder ( this ) ĊĠĠĠĠĠ Ġ}. also Ġ{ Ġfunc Ġ-> ĊĠĠĠĠĠĠĠ Ġfunc . value Parameters Ġ= Ġparameters . map Indexed Ġ{ Ġindex , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġir Factory . create Value Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSYN TH ET IC _ OFFSET , ĠSYN TH ET IC _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ee kt Synt hetic Declaration Origin , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Value Parameter Symbol Impl (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg ElementType Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Cross inline Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis N oin line Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Hidden Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Assignable Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġparent Ġ= Ġfunc Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġis Operator (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠ Ġprotected Ġabstract Ġfun ĠIr Function . is Same Signature (): ĠBoolean ĊĊĠĠĠĠĠ Ġprotected Ġabstract Ġfun Ġis Join ( info In visible : ĠInfo In visible ): ĠBoolean ĊĊĠĠĠĠĠ Ġprotected Ġabstract Ġfun ĠFunction Body Builder . body ( properties : ĠMutable List < Ir Property >): ĠIr Body ĊĊĠĠĠĠĠ Ġfun ĠIr Class . find Super Function ( ĊĠĠĠĠĠĠĠ Ġcontains Any : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġrequire Origin : ĠIr Declaration Origin ? Ġ= Ġnull ĊĠĠĠĠĠ Ġ): ĠIr Function ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠIr Function ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar ĠsuperClass Ġ= Ġthis . super Class ĊĠĠĠĠĠĠĠ Ġwhile Ġ( super Class Ġ!= Ġnull Ġ&& Ġresult Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠsuperClass . find Functions Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( require Origin Ġ!= Ġnull Ġ&& Ġit . origin Ġ!= Ġrequire Origin ) Ġreturn @ find Functions Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Same Signature () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠsuperClass Ġ= ĠsuperClass . super Class ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontains Any Ġ-> Ġresult . if Null Ġ{ Ġir Built Ins . any Class . getSimple Function ( function Name ) !!. owner Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult ?. take If Ġ{ Ġit . parent As Class . symbol Ġ!= Ġir Built Ins . any Class Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġfun ĠIr Class . get Or Super Function (): ĠIr Function Ġ= Ġfind Functions Ġ{ Ġit . is HashCode () Ġ} Ġ?: Ġfind Super Function () !! ĊĊĠĠĠĠĠ Ġfun ĠFunction Body Builder . call Super Function If Defined ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġarguments : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġcontains Any : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠ Ġ): ĠIr Call ? Ġ= ĊĠĠĠĠĠĠĠ Ġir Class . find Super Function ( contains Any , Ġrequire Origin Ġ= ĠIr Declaration Origin . DEFINED )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġir Call With Args ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit , Ġ* arguments , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir This OrNull (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Qualifier Symbol Ġ= Ġit . parent As Class . symbol ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfun Ġcopy ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt ): ĠFoo Ġ{ ĊĠĠĠĠ Ġ* ĠĠ Ġval Ġresult Ġ= ĠFoo ( a ) ĊĠĠĠĠ Ġ* ĠĠ Ġresult . b Ġ= Ġb ĊĠĠĠĠ Ġ* ĠĠ Ġresult . c Ġ= Ġc ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author Ġ åĩ Ľ Ġ( R in Or z ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠCopy Generation ( ĊĠĠĠĠĠ Ġir Class : ĠIr Class , ĊĠĠĠĠĠ Ġprivate Ġval Ġconstructor Entry : ĠIr Constructor , ĊĠĠĠĠĠ Ġprivate Ġval Ġcopy Parameters : ĠList < Function Parameter Id >, ĊĠĠĠ Ġ) Ġ: ĠFunction Generation ( ĊĠĠĠĠĠ Ġir Class , ĊĠĠĠĠĠ Ġfunction Name Ġ= Ġ" copy ", ĊĠĠĠĠĠ ĠreturnType Ġ= Ġir Class . default Type , ĊĠĠĠĠĠ Ġparameters Ġ= Ġcopy Parameters . to Typed Array () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun ĠIr Function . is Same Signature (): ĠBoolean Ġ= Ġis Copy ( copy Parameters ) ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġis Join ( info In visible : ĠInfo In visible ): ĠBoolean Ġ= Ġinfo In visible . generate Copy ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠFunction Body Builder . body ( properties : ĠMutable List < Ir Property >): ĠIr Body Ġ= Ġir Block Body Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Ġ{ Ġ" generate Copy Ġfor Ġ[ ${ function . value Parameters . join ToString Ġ{ Ġit . name . asString () Ġ}} ]" Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġdefault Ġvalues Ġof Ġcopy - function Ġparameters ĊĠĠĠĠĠĠĠ Ġ// Ġ-- Ġfun Ġcopy ( a Ġ= Ġthis . a , Ġb Ġ= Ġthis . b , Ġc Ġ= Ġthis . c ) ĊĠĠĠĠĠĠĠ Ġfunction . value Parameters . forEach Ġ{ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġproperties . single OrNull Ġ{ Ġit . name Ġ== Ġparameter . name Ġ} ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir GetProperty ( ir This (), Ġthis ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġir Call ( constructor Entry . symbol ). also Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġtarget Ġconstructor Ġto Ġcreate Ġnew Ġinstance ĊĠĠĠĠĠĠĠĠĠ Ġconstructor Entry . value Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfun Ġcopy ( a , Ġb , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ ĠFoo ( a , Ġb , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Param Or Property Ġ= Ġfunction . find Value Parameter ( it . name )?. let (:: ir Get ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġir GetProperty ( ir This (), Ġir Class . properties . get ByName ( it . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . put Value Argument ( it . index , Ġget Param Or Property ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġresult Ġ= ĠFoo ( a ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġir Temporary ( instance , Ġ" result ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġall Ġ' var ' Ġproperties Ġthat Ġare Ġnot Ġin Ġthe Ġprimary Ġconstructor ĊĠĠĠĠĠĠĠ Ġproperties . filter Not Ġ{ Ġ! it . is Var Ġ|| Ġconstructor Entry . contains Value Parameter ( it . name ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġresult . a Ġ= Ġa ĊĠĠĠĠĠĠĠĠĠ Ġ+ ir SetProperty ( ir Get ( result ), Ġit , Ġir Get ( function . getValue Parameter ( it . name ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ+ ir Return ( ir Get ( result )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġfun Ġget Required Params () Ġ= Ġir Class . primary Constructor Ġ?: Ġir Class . construct ors . single () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠFunction Parameter Id ( val Ġname : ĠName , Ġval Ġtype : ĠIr Type ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠ Ġ* ĠĠ Ġif Ġ(! super . equals ( other )) Ġreturn Ġfalse ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠ Ġ* ĠĠ Ġif Ġ( other Ġ! is ĠFoo ) Ġreturn Ġfalse ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġif Ġ( a Ġ!= Ġother . a ) Ġreturn Ġfalse ĊĠĠĠĠ Ġ* ĠĠ Ġif Ġ(! b . content Equals ( other . b ) Ġreturn Ġfalse ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġreturn Ġtrue ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author Ġ åĩ Ľ Ġ( R in Or z ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠEquals Generation ( ir Class : ĠIr Class , Ġprivate Ġval Ġsuper Call : ĠBoolean ) Ġ: ĊĠĠĠĠĠ ĠFunction Generation ( ir Class , Ġ" equals ", Ġ" info Equals ", Ġir Built Ins . boolean Type , Ġir Built Ins . any N Type ) Ġ{ ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠIr Function . is Same Signature (): ĠBoolean Ġ= Ġis Equals () ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġis Join ( info In visible : ĠInfo In visible ): ĠBoolean Ġ= Ġinfo In visible . generate Equals ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠFunction Body Builder . body ( properties : ĠMutable List < Ir Property >): ĠIr Body Ġ= Ġir Block Body Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Ġ{ Ġ" generate Equals Ġfor Ġ[ ${ properties . join ToString Ġ{ Ġit . name . asString () Ġ}} ]" Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( properties . isEmpty ()) Ġreturn @ ir Block Body Ġ+ ir Return ( ĊĠĠĠĠĠĠĠĠĠ Ġcall Super Function If Defined ( ir Other (), Ġcontains Any Ġ= Ġtrue ) !! ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġir Get ( function . value Parameters . single ()) ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ(! super . equals ( other )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( super Call ) Ġcall Super Function If Defined ( ir Other ()) ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ+ ir If Then Return False ( ir Not ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ(! ir Class . is Inline ) Ġ+ ir If Then Return True ( ir Eq eq eq ( ir This (), Ġir Other ())) ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( other Ġ! is ĠFoo ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ+ ir If Then Return False ( ir Not Is ( ir Other (), Ġir Type )) ĊĠĠĠĠĠĠĠ Ġ// Ġother Ġas ĠFoo ĊĠĠĠĠĠĠĠ Ġval Ġcast Other Ġ= Ġir Temporary ( ir As ( ir Other (), Ġir Type ), Ġ" cast Other "). symbol ĊĠĠĠĠĠĠĠ Ġfor Ġ( property Ġin Ġproperties ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġproperty . type ĊĠĠĠĠĠĠĠĠĠ Ġval Ġbase Value Ġ= Ġir GetProperty ( ir This (), Ġproperty ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġother Value Ġ= Ġir GetProperty ( ir Get ( ir Type , Ġcast Other ), Ġproperty ) ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ(! a . content Equals ( other . a )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Boxed Or Primitive Array () Ġ-> Ġ+ ir If Then Return False ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Not ( ir Call With Args ( get Array Content Equals ( type ), Ġbase Value , Ġextension Receiver Ġ= Ġother Value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ( a Ġ!= Ġother . a ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ+ ir If Then Return False ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Not Equals ( base Value , Ġother Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ+ ir Return True () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprivate Ġfun ĠFunction Body Builder . ir Other () Ġ= Ġir Get ( function . value Parameters . single ()) ĊĊĠĠĠĠĠ Ġprivate Ġval Ġarray Content Equals Ġby Ġlazy Ġ{ Ġplugin Context . reference Functions ( Content Equals ). map Ġ{ Ġit . owner Ġ} Ġ} ĊĊĠĠĠĠĠ Ġprivate Ġfun Ġget Array Content Equals ( type : ĠIr Type ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġtype . is Primitive Array () Ġ-> Ġarray Content Equals . single Ġ{ Ġit . extension Receiver Parameter ?. type Ġ== Ġtype Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarray Content Equals . single OrNull Ġ{ Ġit . extension Receiver Parameter ?. type ?. isArray () Ġ== Ġtrue Ġ} ĊĠĠĠĠĠ Ġ} Ġ?: Ġerror (" Can 't Ġfind Ġan ĠArrays . content Equals Ġmethod Ġfor Ġarray Ġtype Ġ${ type . render () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠ Ġ* ĠĠ Ġvar Ġresult Ġ= Ġsuper . hashCode () ĊĠĠĠĠ Ġ* ĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( a ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠ Ġ* ĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġb . hashCode () ĊĠĠĠĠ Ġ* ĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġc . content HashCode () ĊĠĠĠĠ Ġ* ĠĠ Ġreturn Ġresult ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author Ġ åĩ Ľ Ġ( R in Or z ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠHash Code Generation ( ir Class : ĠIr Class , Ġprivate Ġval Ġsuper Call : ĠBoolean ) Ġ: ĊĠĠĠĠĠ ĠFunction Generation ( ir Class , Ġ" hashCode ", Ġ" info HashCode ", Ġir Built Ins . int Type ) Ġ{ ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠIr Function . is Same Signature (): ĠBoolean Ġ= Ġis HashCode () ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġis Join ( info In visible : ĠInfo In visible ): ĠBoolean Ġ= Ġinfo In visible . generate HashCode ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠFunction Body Builder . body ( properties : ĠMutable List < Ir Property >): ĠIr Body Ġ= Ġir Block Body Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Ġ{ Ġ" generate HashCode Ġfor Ġ[ ${ properties . join ToString Ġ{ Ġit . name . asString () Ġ}} ]" Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( properties . isEmpty ()) Ġreturn @ ir Block Body Ġ+ ir Return ( call Super Function If Defined ( contains Any Ġ= Ġtrue ) !! ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ-- ĠIf Ġthe Ġparent Ġtypes Ġdefines Ġ' hashCode ', Ġcall Ġthe Ġsuper Ġfunction : ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġvar Ġresult Ġ= Ġsuper . hashCode () ĊĠĠĠĠĠĠĠ Ġ// Ġ-- ĠOtherwise : ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġvar Ġresult Ġ= Ġa . hashCode () ĊĠĠĠĠĠĠĠ Ġval ĠhashCode Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsuper Call Ġ-> Ġcall Super Function If Defined ()?. also Ġ{ Ġlog Ġ{ Ġ" super Ġcall Ġ'${ it . symbol . descriptor . fq Name Safe }'. " Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ}. if Null Ġ{ Ġcall Property HashCode ( function , Ġproperties . remove First (), Ġdefault Ġ= Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġir Temporary ( hashCode , Ġ" result ", Ġis Mutable Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġproperties . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( b ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġc . hashCode () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġshifted Result Ġ= Ġshift HashCode ( result ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġproperty HashCode Ġ= Ġcall Property HashCode ( function , Ġit ) ĊĠĠĠĠĠĠĠĠĠ Ġ+ ir Set ( result , Ġplus HashCode ( shift ed Result , Ġproperty HashCode )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ+ ir Return ( ir Get ( result )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ/** Ġ' 3 1 Ġ* Ġresult ' Ġ*/ ĊĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . shift HashCode ( result : ĠIr Variable ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Call Op ( int Times Symbol , Ġir Built Ins . int Type , Ġir Int ( 3 1 ), Ġir Get ( result )) ĊĊĠĠĠĠĠ Ġ/** Ġshifted Result Ġ+ Ġproperty HashCode Ġ Ġ*/ ĊĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . plus HashCode ( ĊĠĠĠĠĠĠĠ Ġshifted Result : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġproperty HashCode : ĠIr Expression ĊĠĠĠĠĠ Ġ): ĠIr Expression Ġ= Ġir Call Op ( int Plus Symbol , Ġir Built Ins . int Type , Ġshifted Result , Ġproperty HashCode ) ĊĊĠĠĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . call Property HashCode ( ĊĠĠĠĠĠĠĠ Ġdispatch : ĠIr Function , ĊĠĠĠĠĠĠĠ Ġproperty : ĠIr Property , ĊĠĠĠĠĠĠĠ Ġdefault : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠ Ġ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠhashCode Function Ġ= Ġproperty . type . get HashCode Function () ĊĠĠĠĠĠĠĠ Ġval Ġhas Dispatch Receiver Ġ= ĠhashCode Function . descriptor . dispatch Receiver Parameter Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġproperty Value Ġ= Ġir GetProperty ( dispatch , Ġproperty ) ĊĠĠĠĠĠĠĠ Ġval ĠhashCode Call Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhas Dispatch Receiver Ġ-> Ġir Call With Args ( hashCode Function , Ġdispatch Receiver Ġ= Ġproperty Value ) ĊĠĠĠĠĠĠĠĠĠ ĠhashCode Function . value Parameters . size Ġ== Ġ 1 Ġ-> Ġir Call With Args ( hashCode Function , Ġproperty Value ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Cannot Ġcall Ġ'${ hashCode Function . render () }' Ġfor Ġ'$ property '. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( property Ġ== Ġnull ) Ġ' default ' Ġelse Ġproperty . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġproperty . type . is Nullable () Ġ-> Ġir If Null ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġir Built Ins . int Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Ġ= Ġir GetProperty ( dispatch , Ġproperty ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen Part Ġ= Ġir Int ( default ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Part Ġ= ĠhashCode Call ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠhashCode Call ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprivate Ġfun ĠIr Type . get HashCode Function (): ĠIr Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġclassifier OrNull ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis Boxed Or Primitive Array () Ġ-> Ġir Built Ins . data Class Array Member HashCode Symbol . owner ĊĠĠĠĠĠĠĠĠĠ Ġclassifier Ġis ĠIr Class Symbol Ġ-> Ġclassifier . owner . get Or Super Function () ĊĠĠĠĠĠĠĠĠĠ Ġclassifier Ġis ĠIr Type Parameter Symbol Ġ-> Ġclassifier . owner . er ased Upper Bound . get Or Super Function () ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unknown Ġclassifier Ġkind Ġ$ classifier ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠ Ġ* ĠĠ Ġ" User ( name =$ name , Ġaddress =${ address . content ToString ()}, Ġage =$ age , Ġemail =$ email )" ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author Ġ åĩ Ľ Ġ( R in Or z ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠToString Generation ( ir Class : ĠIr Class ) Ġ: ĊĠĠĠĠĠ ĠFunction Generation ( ir Class , Ġ" toString ", Ġ" info ToString ", Ġir Built Ins . string Type ) Ġ{ ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠIr Function . is Same Signature (): ĠBoolean Ġ= Ġis ToString () ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġis Join ( info In visible : ĠInfo In visible ): ĠBoolean Ġ= Ġinfo In visible . generate ToString ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠFunction Body Builder . body ( properties : ĠMutable List < Ir Property >): ĠIr Body Ġ= Ġir Return Expr Body ( ĊĠĠĠĠĠĠĠ Ġir Concat (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog Ġ{ Ġ" generate ToString Ġfor Ġ[ ${ properties . join ToString Ġ{ Ġit . name . asString () Ġ}} ]" Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠUser ( ĊĠĠĠĠĠĠĠĠĠ Ġarguments Ġ+= Ġir String ( ir Class . name . asString () Ġ+ Ġ"(" ) ĊĠĠĠĠĠĠĠĠĠ Ġproperties . forEach Indexed Ġ{ Ġindex , Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġir GetProperty ( ir This (), Ġproperty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġproperty . type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprev , Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 0 ) Ġarguments Ġ+= Ġir String (", Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfoo = ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ+= Ġir String ( property . name . asString () Ġ+ Ġ"=" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ+= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ${ bar . content ToString ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Boxed Or Primitive Array () Ġ-> Ġir Call With Args ( ir Built Ins . data Class Array Member ToString Symbol , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ$ bar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġarguments Ġ+= Ġir String (" )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġoperator Ġfun Ġcomponent 1 (): ĠString Ġ= Ġa ĊĠĠĠĠ Ġ* Ġoperator Ġfun Ġcomponent 2 (): ĠString Ġ= Ġb ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author Ġ åĩ Ľ Ġ( R in Or z ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠComponent N Generation ( ĊĠĠĠĠĠ Ġir Class : ĠIr Class , ĊĠĠĠĠĠ Ġprivate Ġval Ġnumber : ĠInt , ĊĠĠĠĠĠ Ġprivate Ġval Ġproperty : ĠIr Property ĊĠĠĠ Ġ) Ġ: ĠFunction Generation ( ir Class , Ġ" component $ number ", Ġnull , Ġproperty . type ) Ġ{ ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġis Operator (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠIr Function . is Same Signature (): ĠBoolean Ġ= Ġis Component N ( number ) ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġis Join ( info In visible : ĠInfo In visible ): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠFunction Body Builder . body ( properties : ĠMutable List < Ir Property >): ĠIr Body Ġ= ĊĠĠĠĠĠĠĠ Ġir Return Expr Body ( ir GetProperty ( ir This (), Ġproperty )) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ