package Ġme . mat t co . ree va . ast . literals Ċ Ċ import Ġme . mat t co . ree va . ast .* Ċ import Ġme . mat t co . ree va . ast . AST Node . Companion . append Indent Ċ import Ġme . mat t co . ree va . ast . statements . Statement ListNode Ċ import Ġme . mat t co . ree va . runtime . Operations Ċ import Ġme . mat t co . ree va . runtime . primitives . JS Number Ċ import Ġme . mat t co . ree va . utils . unreachable Ċ Ċ class ĠObject Literal Node ( val Ġlist : ĠProperty Definition ListNode ?) Ġ: ĠNode Base ( listOf NotNull ( list )), ĠPrimary Expression Node Ċ Ċ class ĠProperty Definition ListNode ( val Ġproperties : ĠList < Property Definition Node >) Ġ: ĠNode Base ( properties ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠpropertyName List (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproperties . map NotNull ( AST Node :: prop Name ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ" first " Ġand Ġ" second " Ġhave Ġdifferent Ġinterpret ations Ġbased Ġon Ġthe Ġtype Ċ class ĠProperty Definition Node ( ĊĠĠĠ Ġval Ġfirst : ĠAST Node , ĊĠĠĠ Ġval Ġsecond : ĠExpression Node ?, ĊĠĠĠ Ġval Ġtype : ĠType Ċ ) Ġ: ĠNode Base ( listOf NotNull ( first , Ġsecond )) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcontains ( nodeName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( nodeName Ġ== Ġ" Method Definition Node ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠType . Method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst . computed Property Contains ( nodeName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . contains ( nodeName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprop Name (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Sh orthand Ġ-> Ġ( first Ġas ĠIdentifier Node ). identifier Name ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . KeyValue Ġ-> Ġfirst . prop Name () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Method Ġ-> Ġsuper . prop Name () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Spread Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Initializer Ġ-> Ġunreachable () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdump ( indent : ĠInt ) Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend Indent ( indent ) ĊĠĠĠĠĠĠĠ Ġappend Name () ĊĠĠĠĠĠĠĠ Ġappend (" Ġ( type =") ĊĠĠĠĠĠĠĠ Ġappend ( type . name ) ĊĠĠĠĠĠĠĠ Ġappend (" )\ n ") ĊĠĠĠĠĠĠĠ Ġappend ( first . dump ( indent Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġsecond ?. dump ( indent Ġ+ Ġ 1 )?. also (:: append ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠType Ġ{ ĊĠĠĠĠĠĠĠ ĠKey Value , ĊĠĠĠĠĠĠĠ ĠSh orthand , ĊĠĠĠĠĠĠĠ ĠMethod , ĊĠĠĠĠĠĠĠ ĠSp read , ĊĠĠĠĠĠĠĠ ĠInitial izer , ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠProperty Name Node ( val Ġexpr : ĠExpression Node , Ġval Ġis Computed : ĠBoolean ) Ġ: ĠNode Base ( listOf ( expr )) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcomputed Property Contains ( nodeName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Computed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġexpr . contains ( nodeName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( nodeName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expr Ġis ĠIdentifier Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . contains ( nodeName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Computed Property Key () Ġ= Ġis Computed ĊĊĠĠĠ Ġoverride Ġfun Ġprop Name () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis Computed Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġexpr Ġis ĠIdentifier Node Ġ-> Ġexpr . identifier Name ĊĠĠĠĠĠĠĠ Ġexpr Ġis ĠString Literal Node Ġ-> Ġexpr . value ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġkind a Ġsc uff ed ĊĠĠĠĠĠĠĠ Ġexpr Ġis ĠNumeric Literal Node Ġ-> Ġexpr . value . toString () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunreachable () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMethod Definition Node ( ĊĠĠĠ Ġval Ġidentifier : ĠProperty Name Node , ĊĠĠĠ Ġval Ġparameters : ĠF ormal Parameters Node , ĊĠĠĠ Ġval Ġbody : ĠFunction Statement List , ĊĠĠĠ Ġval Ġtype : ĠType Ċ ) Ġ: ĠNode Base ( listOf NotNull ( identifier , Ġparameters , Ġbody )) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcomputed Property Contains ( nodeName : ĠString ) Ġ= Ġidentifier . computed Property Contains ( nodeName ) ĊĊĠĠĠ Ġoverride Ġfun Ġhas Direct Super (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Normal , ĠType . Setter Ġ-> Ġparameters . contains (" Super Call Node ") Ġ|| Ġbody . contains (" Super Call Node ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Getter Ġ-> Ġbody . contains (" Super Call Node ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Generator , ĠType . Async , ĠType . Async Generator Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprop Name () Ġ= Ġidentifier . prop Name () ĊĊĠĠĠ Ġenum Ġclass ĠType Ġ{ ĊĠĠĠĠĠĠĠ ĠNormal , ĊĠĠĠĠĠĠĠ ĠGetter , ĊĠĠĠĠĠĠĠ ĠSetter , ĊĠĠĠĠĠĠĠ ĠGenerator , ĊĠĠĠĠĠĠĠ ĠAsync , ĊĠĠĠĠĠĠĠ ĠAsync Generator , ĊĠĠĠ Ġ} Ċ } Ċ