/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠFranc is ĠWang Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġio . ver ik . compiler . transform . pre Ċ Ċ import Ġio . ver ik . compiler . ast . element . kt . EK t Array Access Expression Ċ import Ġio . ver ik . compiler . ast . element . kt . EK t Binary Expression Ċ import Ġio . ver ik . compiler . ast . element . kt . EK t Call Expression Ċ import Ġio . ver ik . compiler . ast . interfaces . Declaration Ċ import Ġio . ver ik . compiler . ast . property . Kt Binary Operator Kind Ċ import Ġio . ver ik . compiler . ast . property . Type Ċ import Ġio . ver ik . compiler . common . Project Stage Ċ import Ġio . ver ik . compiler . common . Tree Visitor Ċ import Ġio . ver ik . compiler . core . common . Core Ċ import Ġio . ver ik . compiler . core . common . Core Kt Abstract Function Declaration Ċ import Ġio . ver ik . compiler . main . Project Context Ċ import Ġio . ver ik . compiler . message . Messages Ċ Ċ object ĠArray Access Expression Reducer Stage Ġ: ĠProject Stage () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġcheck Normalization Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġget Reducer Entries Ġ= ĠArrayList < Get Reducer Entry >() ĊĠĠĠ Ġprivate Ġval Ġset Reducer Entries Ġ= ĠArrayList < Set Reducer Entry >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġget Reducer Entries . add ( Get Reducer Entry ( Core . Vk . C _ U bit , ĠlistOf ( Core . Kt . C _ Int ), ĠCore . Vk . U bit . F _ get _ Int )) ĊĠĠĠĠĠĠĠ Ġget Reducer Entries . add ( Get Reducer Entry ( Core . Vk . C _ Un packed , ĠlistOf ( Core . Kt . C _ Int ), ĠCore . Vk . Un packed . F _ get _ Int )) ĊĠĠĠĠĠĠĠ Ġget Reducer Entries . add ( Get Reducer Entry ( Core . Vk . C _ Un packed , ĠlistOf ( Core . Vk . C _ U bit ), ĠCore . Vk . Un packed . F _ get _ U bit )) ĊĊĠĠĠĠĠĠĠ Ġset Reducer Entries . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSet Reducer Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . C _ U bit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Core . Kt . C _ Int ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Kt . C _ Boolean . to Type (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . U bit . F _ set _ Int _ Boolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Reducer Entries . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSet Reducer Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . C _ U bit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Core . Kt . C _ Int ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . C _ U bit . to Type ( Core . Vk . N _ Card inal . to Type ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . U bit . F _ set _ Int _ U bit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Reducer Entries . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSet Reducer Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . C _ Un packed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Core . Kt . C _ Int ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Kt . C _ Any . to Type (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . Un packed . F _ set _ Int _ Any ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Reducer Entries . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSet Reducer Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . C _ Un packed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Core . Vk . C _ U bit ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Kt . C _ Any . to Type (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore . Vk . Un packed . F _ set _ U bit _ Any ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( project Context : ĠProject Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject Context . project . accept ( Array Access Expression Reducer Visitor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠGet Reducer Entry ( ĊĠĠĠĠĠĠĠ Ġval Ġarray Declaration : ĠDeclaration , ĊĠĠĠĠĠĠĠ Ġval Ġindex Declarations : ĠList < Declaration >, ĊĠĠĠĠĠĠĠ Ġval Ġreference : ĠCore Kt Abstract Function Declaration ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Declaration : ĠDeclaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Declarations : ĠList < Declaration > ĊĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . array Declaration Ġ== Ġarray Declaration Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . index Declarations Ġ== Ġindex Declarations ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠSet Reducer Entry ( ĊĠĠĠĠĠĠĠ Ġval Ġarray Declaration : ĠDeclaration , ĊĠĠĠĠĠĠĠ Ġval Ġindex Declarations : ĠList < Declaration >, ĊĠĠĠĠĠĠĠ Ġval Ġexpression Type : ĠType , ĊĠĠĠĠĠĠĠ Ġval Ġreference : ĠCore Kt Abstract Function Declaration ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Declaration : ĠDeclaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Declarations : ĠList < Declaration >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Type : ĠType ĊĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . array Declaration Ġ== Ġarray Declaration Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . index Declarations Ġ== Ġindex Declarations Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Type . is Subtype ( this . expression Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠArray Access Expression Reducer Visitor Ġ: ĠTree Visitor () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Get Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Declaration : ĠDeclaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Declarations : ĠList < Declaration > ĊĠĠĠĠĠĠĠ Ġ): ĠCore Kt Abstract Function Declaration ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Reducer Entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . match ( array Declaration , Ġindex Declarations )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Set Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Declaration : ĠDeclaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Declarations : ĠList < Declaration >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Type : ĠType ĊĠĠĠĠĠĠĠ Ġ): ĠCore Kt Abstract Function Declaration ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Reducer Entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . match ( array Declaration , Ġindex Declarations , Ġexpression Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Kt Binary Expression ( binary Expression : ĠE Kt Binary Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġbinary Expression . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġis ĠE Kt Array Access Expression Ġ&& Ġbinary Expression . kind Ġ== ĠK t Binary Operator Kind . EQ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft . accept Children ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Expression . right . accept ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġbinary Expression . right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Declaration Ġ= Ġleft . array . type . reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Declarations Ġ= Ġleft . indices . map Ġ{ Ġit . type . reference Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Type Ġ= Ġright . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġget Set Reference ( array Declaration , Ġindex Declarations , Ġexpression Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Expression . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE Kt Call Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Expression . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Expression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft . array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList ( left . indices Ġ+ Ġright ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessages . INTERNAL _ ERROR . on ( left , Ġ" Array Ġaccess Ġexpression Ġcould Ġnot Ġbe Ġreduced ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Kt Binary Expression ( binary Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Kt Array Access Expression ( array Access Expression : ĠE Kt Array Access Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Kt Array Access Expression ( array Access Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Declaration Ġ= Ġarray Access Expression . array . type . reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Declarations Ġ= Ġarray Access Expression . indices . map Ġ{ Ġit . type . reference Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġget Get Reference ( array Declaration , Ġindex Declarations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Access Expression . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE Kt Call Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Access Expression . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Access Expression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Access Expression . array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Access Expression . indices , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessages . INTERNAL _ ERROR . on ( array Access Expression , Ġ" Array Ġaccess Ġexpression Ġcould Ġnot Ġbe Ġreduced ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ