/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 Ġ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 . contracts . description Ċ Ċ import Ġorg . jetbrains . kotlin . contracts . description . expressions .* Ċ Ċ class ĠContract Description Renderer ( private Ġval Ġbuilder : ĠStringBuilder ) Ġ: ĠContract Description Visitor < Unit , ĠUnit > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvisit Conditional Effect Declaration ( conditional Effect : ĠConditional Effect Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconditional Effect . effect . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ-> Ġ") ĊĠĠĠĠĠĠĠ Ġconditional Effect . condition . accept ( this , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Returns Effect Declaration ( returns Effect : ĠReturns Effect Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append (" Returns (" ) ĊĠĠĠĠĠĠĠ Ġreturns Effect . value . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġbuilder . append (" )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Calls Effect Declaration ( calls Effect : ĠCalls Effect Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append (" Calls In Place (" ) ĊĠĠĠĠĠĠĠ Ġcalls Effect . variable Reference . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġbuilder . append (", Ġ${ calls Effect . kind }) ") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Logical Or ( logical Or : ĠLogical Or , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Br ackets If Ne cessary ( logical Or , Ġlogical Or . left ) Ġ{ Ġlogical Or . left . accept ( this , Ġdata ) Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ|| Ġ") ĊĠĠĠĠĠĠĠ Ġin Br ackets If Ne cessary ( logical Or , Ġlogical Or . right ) Ġ{ Ġlogical Or . right . accept ( this , Ġdata ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Logical And ( logical And : ĠLogical And , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Br ackets If Ne cessary ( logical And , Ġlogical And . left ) Ġ{ Ġlogical And . left . accept ( this , Ġdata ) Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ&& Ġ") ĊĠĠĠĠĠĠĠ Ġin Br ackets If Ne cessary ( logical And , Ġlogical And . right ) Ġ{ Ġlogical And . right . accept ( this , Ġdata ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Logical Not ( logical Not : ĠLogical Not , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Br ackets If Ne cessary ( logical Not , Ġlogical Not . arg ) Ġ{ Ġbuilder . append (" !") Ġ} ĊĠĠĠĠĠĠĠ Ġlogical Not . arg . accept ( this , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Is Instance Predicate ( is Instance Predicate : ĠIs Instance Predicate , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Instance Predicate . arg . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ${ if Ġ( is Instance Predicate . is Neg ated ) Ġ" !" Ġelse Ġ"" } is Ġ${ is Instance Predicate . type }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit IsNull Predicate ( isNull Predicate : ĠIs Null Predicate , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Null Predicate . arg . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ${ if Ġ( isNull Predicate . is Neg ated ) Ġ"! =" Ġelse Ġ" ==" } Ġnull ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Constant Descriptor ( constant Reference : ĠConstant Reference , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( constant Reference . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Variable Reference ( variable Reference : ĠVariable Reference , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( variable Reference . descriptor . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠContract Description Element . is Atom (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠVariable Reference Ġ|| Ġthis Ġis ĠConstant Reference Ġ|| Ġthis Ġis ĠIs Null Predicate Ġ|| Ġthis Ġis ĠIs Instance Predicate ĊĊĠĠĠ Ġprivate Ġfun Ġneeds Br ackets ( parent : ĠContract Description Element , Ġchild : ĠContract Description Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child . is Atom ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠLogical Not ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġparent :: class Ġ!= Ġchild :: class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġin Br ackets If Ne cessary ( parent : ĠContract Description Element , Ġchild : ĠContract Description Element , Ġblock : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( needs Br ackets ( parent , Ġchild )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }