/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 Ġ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 . idea . intent ions . loop To Call Chain . sequence Ċ Ċ import Ġorg . jetbrains . kotlin . idea . intent ions . loop To Call Chain . has Usage s Ċ import Ġorg . jetbrains . kotlin . idea . intent ions . neg ate Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ Ċ interface ĠCondition Ġ{ ĊĠĠĠ Ġfun Ġas Expression (): ĠK t Expression ĊĠĠĠ Ġfun Ġas Neg ated Expression (): ĠK t Expression ĊĠĠĠ Ġfun Ġto Atomic Conditions (): ĠList < Atomic Condition > ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( expression : ĠK t Expression , Ġneg ated : ĠBoolean Ġ= Ġfalse ): ĠCondition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( neg ated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠK t Binary Expression Ġ&& Ġexpression . operation Token Ġ== ĠK t Tokens . OR OR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġcheck ĠBoolean Ġtype Ġfor Ġoperands ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġexpression . left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġexpression . right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ!= Ġnull Ġ&& Ġright Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Condition Ġ= Ġcreate ( left , Ġneg ated Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Condition Ġ= Ġcreate ( right , Ġneg ated Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComposite Condition . create ( left Condition . to Atomic Conditions () Ġ+ Ġright Condition . to Atomic Conditions ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠK t Binary Expression Ġ&& Ġexpression . operation Token Ġ== ĠK t Tokens . AND AND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġcheck ĠBoolean Ġtype Ġfor Ġoperands ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġexpression . left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġexpression . right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ!= Ġnull Ġ&& Ġright Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Condition Ġ= Ġcreate ( left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Condition Ġ= Ġcreate ( right ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComposite Condition . create ( left Condition . to Atomic Conditions () Ġ+ Ġright Condition . to Atomic Conditions ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAtomic Condition ( expression , Ġneg ated ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAtomic Condition ( val Ġexpression : ĠK t Expression , Ġval Ġis Neg ated : ĠBoolean Ġ= Ġfalse ) Ġ: ĠCondition Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( expression . is Physical ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġas Expression () Ġ= Ġif Ġ( is Neg ated ) Ġexpression . neg ate () Ġelse Ġexpression ĊĠĠĠ Ġoverride Ġfun Ġas Neg ated Expression () Ġ= Ġif Ġ( is Neg ated ) Ġexpression Ġelse Ġexpression . neg ate () ĊĠĠĠ Ġoverride Ġfun Ġto Atomic Conditions () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġfun Ġneg ate () Ġ= ĠAtomic Condition ( expression , Ġ! is Neg ated ) Ċ } Ċ Ċ class ĠComposite Condition Ġprivate Ġconstructor ( val Ġconditions : ĠList < Atomic Condition >) Ġ: ĠCondition Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġas Expression (): ĠK t Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠK t Psi Factory ( conditions . first (). expression ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfactory . build Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġcondition ) Ġin Ġconditions . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Fixed Text (" && ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Expression ( condition . as Expression ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġas Neg ated Expression (): ĠK t Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġas Expression (). neg ate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Atomic Conditions () Ġ= Ġconditions ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( conditions : ĠList < Atomic Condition >): ĠCondition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconditions . single OrNull () Ġ?: ĠComposite Condition ( conditions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠCondition . has Usage s Of ( variable : ĠK t Callable Declaration ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġto Atomic Conditions (). any Ġ{ Ġvariable . has Usage s ( it . expression ) Ġ} Ċ } ĊĊ