/* Ċ Ġ* Ġ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 . j 2 k . ast Ċ Ċ import Ġorg . jetbrains . kotlin . j 2 k . Code Builder Ċ import Ġorg . jetbrains . kotlin . j 2 k . append Ċ Ċ class ĠArray Access Expression ( val Ġexpression : ĠExpression , Ġval Ġindex : ĠExpression , Ġval Ġl value : ĠBoolean ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġexpression ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! l value Ġ&& Ġexpression . is Nullable ) Ġbuilder . append (" !! ") ĊĠĠĠĠĠĠĠ Ġbuilder Ġappend Ġ"[" Ġappend Ġindex Ġappend Ġ" ]" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAssignment Expression ( val Ġleft : ĠExpression , Ġval Ġright : ĠExpression , Ġval Ġop : ĠString ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġleft ). append (" Ġ"). append ( op ). append (" Ġ"). append Operand ( this , Ġright ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠB ang Bang Expression ( val Ġexpr : ĠExpression ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġexpr ). append (" !! ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsur round If Nullable ( expression : ĠExpression ): ĠExpression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expression . is Nullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB ang Bang Expression ( expression ). assign No Prototype () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠBinary Expression ( val Ġleft : ĠExpression , Ġval Ġright : ĠExpression , Ġval Ġop : ĠString ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġleft , Ġfalse ). append (" Ġ"). append ( op ). append (" Ġ"). append Operand ( this , Ġright , Ġtrue ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠIs Operator ( val Ġexpression : ĠExpression , Ġval Ġtype : ĠType ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġexpression ). append (" Ġis Ġ"). append ( type ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠType Cast Expression ( val Ġtype : ĠType , Ġval Ġexpression : ĠExpression ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġexpression ). append (" Ġas Ġ"). append ( type ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLiteral Expression ( val Ġliteral Text : ĠString ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( literal Text ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠParent hesized Expression ( val Ġexpression : ĠExpression ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Ġappend Ġ"(" Ġappend Ġexpression Ġappend Ġ")" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPrefix Expression ( val Ġop : ĠString , Ġval Ġexpression : ĠExpression ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ){ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( op ). append Operand ( this , Ġexpression ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġis Nullable : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġexpression . is Nullable Ċ } Ċ Ċ class ĠPost fix Expression ( val Ġop : ĠString , Ġval Ġexpression : ĠExpression ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġexpression ) Ġappend Ġop ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠThis Expression ( val Ġidentifier : ĠIdentifier ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append (" this "). append With Prefix ( identifier , Ġ"@ ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSuper Expression ( val Ġidentifier : ĠIdentifier ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append (" super "). append With Prefix ( identifier , Ġ"@ ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠQual ified Expression ( val Ġqualifier : ĠExpression , Ġval Ġidentifier : ĠExpression ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Nullable : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġidentifier . is Nullable ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! qual ifier . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġqualifier ). append ( if Ġ( qual ifier . is Nullable ) Ġ" !! ." Ġelse Ġ". ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . append ( identifier ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPoly adic Expression ( val Ġexpressions : ĠList < Expression >, Ġval Ġtoken : ĠString ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( expressions , Ġ" Ġ" Ġ+ Ġtoken Ġ+ Ġ" Ġ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLambda Expression ( val Ġparameter List : ĠParameter List ?, Ġval Ġblock : ĠBlock ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassign Pro totypes From ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Ġappend Ġblock . l Brace Ġappend Ġ" Ġ" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( parameter List Ġ!= Ġnull Ġ&& Ġ! parameter List . parameters . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( parameter List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" -> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( if Ġ( block . statements . size () Ġ> Ġ 1 ) Ġ"\ n " Ġelse Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( block . statements , Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( block . statements , Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder Ġappend Ġ" Ġ" Ġappend Ġblock . r Brace ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠStar Expression ( val Ġoperand : ĠExpression ) Ġ: ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ("* "). append Operand ( this , Ġoperand ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠRange Expression ( val Ġstart : ĠExpression , Ġval Ġend : ĠExpression ): ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġstart ). append (" .. "). append Operand ( this , Ġend ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDown To Expression ( val Ġstart : ĠExpression , Ġval Ġend : ĠExpression ): ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append Operand ( this , Ġstart ). append (" Ġdown To Ġ"). append Operand ( this , Ġend ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠClass Literal Expression ( val Ġtype : ĠType ): ĠExpression () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate Code ( builder : ĠCode Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( type ). append (" :: class ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcreate Array Initializer Expression ( array Type : ĠArray Type , Ġinitial izers : ĠList < Expression >, Ġneed Explicit Type : ĠBoolean Ġ= Ġtrue ) Ġ: ĠMethod Call Expression Ġ{ ĊĠĠĠ Ġval Ġelement Type Ġ= Ġarray Type . elementType ĊĠĠĠ Ġval Ġcreate Array Function Ġ= Ġif Ġ( elementType Ġis ĠPrimitive Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( elementType . to NotNull Type (). canonical Code () Ġ+ Ġ" ArrayOf "). de capitalize () ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( need Explicit Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" array Of < " Ġ+ Ġarray Type . elementType . canonical Code () Ġ+ Ġ" >" ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" array Of " ĊĠĠĠ Ġreturn ĠMethod Call Expression . build NotNull ( null , Ġcreate Array Function , Ġinitial izers ) Ċ } Ċ