/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . ir . backend . js . dce Ċ Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . Js Ir Backend Context Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . Js Statement Orig ins Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . export . is Exported Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . lower . is BuiltIn Class Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils . associated Object Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils . get Js Name Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils . get Js Name Or Kotlin Name Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils . invoke Fun For Lambda Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types . class OrNull Ċ import Ġorg . jetbrains . kotlin . ir . types . classifier OrFail Ċ import Ġorg . jetbrains . kotlin . ir . types . classifier OrNull Ċ import Ġorg . jetbrains . kotlin . ir . types . getClass Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ Ċ internal Ġclass ĠJs Use ful Declaration Processor ( ĊĠĠĠ Ġoverride Ġval Ġcontext : ĠJs Ir Backend Context , ĊĠĠĠ Ġprint Reach ability Info : ĠBoolean , ĊĠĠĠ Ġremove Unused Associated Objects : ĠBoolean Ċ ) Ġ: ĠUseful Declaration Processor ( print Reach ability Info , Ġremove Unused Associated Objects ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġequals Method Ġ= Ġget Method Of Any (" equals ") ĊĠĠĠ Ġprivate Ġval ĠhashCode Method Ġ= Ġget Method Of Any (" hashCode ") ĊĊĠĠĠ Ġoverride Ġval Ġbody Visitor : ĠBody Visitor Base Ġ= Ġobject Ġ: ĠBody Visitor Base () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call , Ġdata : ĠIr Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Call ( expression , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Box Intr insic Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinline Class Ġ= Ġcontext . inline Classes Utils . getIn lined Class ( expression . getType Argument ( 0 ) !! ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġinline Class . declarations . filter Is Instance < Ir Constructor >(). single Ġ{ Ġit . is Primary Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . enqueue ( data , Ġ" intrinsic : Ġjs Box Intr insic ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġexpression . getType Argument ( 0 ) !!. classifier OrFail . owner Ġas ĠIr Declaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . enqueue ( data , Ġ" intrinsic : Ġjs Class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferenced Js Classes Ġ+= Ġref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġclass Ġreference Ġprovided Ġas Ġparameter Ġto Ġexternal Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġcan Ġbe Ġinstantiated Ġby Ġexternal ĠJS Ġscript ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNeed Ġto Ġleave Ġconstructor Ġfor Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// yout rack . jetbrains . com / issue / KT - 4 6 6 7 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠPo ss ibly Ġsolution Ġwith Ġorigin Ġis Ġnot Ġso Ġgood ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ĠThere Ġis Ġoption Ġwith Ġapplying Ġthis Ġhack Ġto Ġjs Get K Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . origin Ġ== ĠJs Statement Orig ins . CLASS _ REFERENCE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMaybe Ġwe Ġneed Ġto Ġfilter Ġprimary Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlthough Ġat Ġthis Ġtime , Ġwe Ġshould Ġhave Ġonly Ġprimary Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ref Ġas ĠIr Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. construct ors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . enqueue ( data , Ġ" intrinsic : Ġjs Class Ġ( constructor )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . reflection Symbols . get K Class From Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġexpression . getType Argument ( 0 )?. class OrNull Ġ?: Ġcontext . ir Built Ins . any Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferenced Js Classes From Expressions Ġ+= Ġref . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Object Create Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass To Create Ġ= Ġexpression . getType Argument ( 0 ) !!. classifier OrFail . owner Ġas ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass To Create . enqueue ( data , Ġ" intrinsic : Ġjs Object Create ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructed Classes Ġ+= Ġclass To Create ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Equals Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequals Method . enqueue ( data , Ġ" intrinsic : Ġjs Equals ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js ToString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtoString Method . enqueue ( data , Ġ" intrinsic : Ġjs ToString ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js HashCode Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠhashCode Method . enqueue ( data , Ġ" intrinsic : Ġjs HashCode ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Plus Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . getValue Argument ( 0 )?. type ?. class OrNull Ġ== Ġcontext . ir Built Ins . string Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtoString Method . enqueue ( data , Ġ" intrinsic : Ġjs Plus ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Construct Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Type Ġ= Ġexpression . getType Argument ( 0 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġcall Type . getClass () !!. primary Constructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor !!. enqueue ( data , Ġ" ctor Ġcall Ġfrom Ġjs Construct - intrinsic ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . es 6 Default Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// same Ġas Ġjs Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġexpression . getType Argument ( 0 ) !!. classifier OrFail . owner Ġas ĠIr Declaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . enqueue ( data , Ġ" intrinsic : Ġjs Class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferenced Js Classes Ġ+= Ġref ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Generate Ġklass Ġin Ġ` val Ġcurr Result Type Ġ= Ġresult Type Ġ|| Ġklass ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġexpression . getType Argument ( 0 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġarg . getClass () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( klass Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructed Classes . add ( klass ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Invoke Suspend Super Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Invoke Suspend Super Type With Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . js Invoke Suspend Super Type With Receiver And Param Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Fun For Lambda ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( data , Ġ" intrinsic : Ġsuspend Super Type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Class ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . process Class ( ir Class ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ir Class . contains Metadata ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . is Interface Ġ-> Ġcontext . intr insics . metadata Interface Constructor Symbol . owner . enqueue ( ir Class , Ġ" interface Ġmetadata ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . isObject Ġ-> Ġcontext . intr insics . metadata Object Constructor Symbol . owner . enqueue ( ir Class , Ġ" object Ġmetadata ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcontext . intr insics . metadata Class Constructor Symbol . owner . enqueue ( ir Class , Ġ" class Ġmetadata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Class . contains Metadata (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġ! is External Ġ&& Ġ! is Expect Ġ&& Ġ Ġ! is BuiltIn Class ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Construct ed Class Declaration ( declaration : ĠIr Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġin Ġresult ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġsuper . process Construct ed Class Declaration ( declaration ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠIr Simple Function Ġ&& Ġdeclaration . get Js Name Or Kotlin Name (). asString () Ġ== Ġ" valueOf ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . enqueue ( declaration , Ġ" valueOf ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġhack Ġto Ġsupport Ġ` toJson ` Ġand Ġother Ġjs - specific Ġmembers ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . get Js Name () Ġ!= Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Ġis ĠIr Field Ġ&& Ġdeclaration . corre sponding Property Symbol ?. owner ?. get Js Name () Ġ!= Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Ġis ĠIr Simple Function Ġ&& Ġdeclaration . corre sponding Property Symbol ?. owner ?. get Js Name () Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . enqueue ( declaration , Ġ" annotated Ġby Ġ@ Js Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreferenced Js Classes Ġ= Ġhash Set Of < Ir Declaration >() ĊĠĠĠ Ġprivate Ġval Ġreferenced Js Classes From Expressions Ġ= Ġhash Set Of < Ir Class >() ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Associated Objects () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Handle Ġobjects , Ġconstructed Ġvia Ġ` find Associated Object ` Ġannotation ĊĠĠĠĠĠĠĠ Ġreferenced Js Classes From Expressions Ġ+= Ġconstructed Classes . filter Desc endants Of ( referenced Js Classes From Expressions ) Ġ// ĠGrow Ġthe Ġset Ġof Ġpossible Ġresults Ġof Ġinstance :: class Ġexpression ĊĠĠĠĠĠĠĠ Ġfor Ġ( klass Ġin Ġclasses With Object Associations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Unused Associated Objects Ġ&& Ġklass Ġ! in Ġreferenced Js Classes Ġ&& Ġklass Ġ! in Ġreferenced Js Classes From Expressions ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( annotation Ġin Ġklass . annotations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Class Ġ= Ġannotation . symbol . owner . construct ed Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Unused Associated Objects Ġ&& Ġannotation Class Ġ! in Ġreferenced Js Classes ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation . associated Object ()?. let Ġ{ Ġobj Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . mapping . object To GetInstance Function [ obj ]?. enqueue ( klass , Ġ" associated Ġobject Ġfactory ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Exported ( declaration : ĠIr Declaration ): ĠBoolean Ġ= Ġdeclaration . is Exported ( context ) Ċ } ĊĊ Ċ private Ġfun ĠCollection < Ir Class >. filter Desc endants Of ( bases : ĠCollection < Ir Class >): ĠCollection < Ir Class > Ġ{ ĊĠĠĠ Ġval Ġvisited Ġ= Ġhash Set Of < Ir Class >() ĊĠĠĠ Ġval Ġbase Desc endants Ġ= Ġhash Set Of < Ir Class >() ĊĠĠĠ Ġbase Desc endants Ġ+= Ġbases ĊĊĠĠĠ Ġfun Ġoverrides Any Base ( klass : ĠIr Class ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( klass Ġin Ġbase Desc endants ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( klass Ġin Ġvisited ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvisited Ġ+= Ġklass ĊĊĠĠĠĠĠĠĠ Ġklass . super Types . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . classifier OrNull Ġas ? ĠIr Class Symbol )?. owner ?. let Ġ{ Ġklass Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( overrides Any Base ( klass )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Desc endants Ġ+= Ġklass ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis . filter Ġ{ Ġoverrides Any Base ( it ) Ġ} Ċ }