package Ġio . gitlab . art urb os ch . de te kt . rules . bugs Ċ Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Code S mell Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Config Ċ import Ġio . gitlab . art urb os ch . de te kt . api . De bt Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Entity Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Issue Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Rule Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Severity Ċ import Ġio . gitlab . art urb os ch . de te kt . rules . is Equals Function Ċ import Ġio . gitlab . art urb os ch . de te kt . rules . is HashCode Function Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . Psi File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġjava . util . Array Deque Ċ Ċ /** Ċ Ġ* ĠWhen Ġa Ġclass Ġoverrides Ġthe Ġequals () Ġmethod Ġit Ġshould Ġalso Ġoverride Ġthe ĠhashCode () Ġmethod . Ċ Ġ* Ċ Ġ* ĠAll Ġhash - based Ġcollections Ġdepend Ġon Ġobjects Ġmeeting Ġthe Ġequals - contract . ĠTwo Ġequal Ġobjects Ġmust Ġproduce Ġthe Ċ Ġ* Ġsame Ġhash code . ĠWhen Ġinherit ing Ġequals Ġor Ġhash code , Ġoverride Ġthe Ġinherited Ġand Ġcall Ġthe Ġsuper Ġmethod Ġfor Ċ Ġ* Ġclar ification . Ċ Ġ* Ċ Ġ* Ġ< non comp liant > Ċ Ġ* Ġclass ĠFoo Ġ{ Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . equals ( other ) Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ</ non comp liant > Ċ Ġ* Ċ Ġ* Ġ< comp liant > Ċ Ġ* Ġclass ĠFoo Ġ{ Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . equals ( other ) Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . hashCode () Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ</ comp liant > Ċ Ġ* Ċ Ġ* Ġ@ active Ġsince Ġv 1 . 0 . 0 Ċ Ġ*/ Ċ class ĠEqual sWith HashCode Exist ( config : ĠConfig Ġ= ĠConfig . empty ) Ġ: ĠRule ( config ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġissue Ġ= ĠIssue (" Equals With HashCode Exist ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeverity . Defect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Always Ġoverride ĠhashCode Ġwhen Ġyou Ġoverride Ġequals . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġhash - based Ġcollections Ġdepend Ġon Ġobjects Ġmeeting Ġthe Ġequals - contract . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Two Ġequal Ġobjects Ġmust Ġproduce Ġthe Ġsame Ġhash code . ĠWhen Ġinherit ing Ġequals Ġor Ġhash code , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" override Ġthe Ġinherited Ġand Ġcall Ġthe Ġsuper Ġmethod Ġfor Ġclar ification .", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDeb t . FI VE _ MIN S ) ĊĊĠĠĠ Ġprivate Ġval Ġqueue Ġ= ĠArray Deque < Violation Holder >( MAXIMUM _ EXPECTED _ NE ST ED _ CLASSES ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠVi olation Holder ( var Ġequals : ĠBoolean Ġ= Ġfalse , Ġvar ĠhashCode : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġviolation () Ġ= Ġequals Ġ&& Ġ! hashCode Ġ|| Ġ! equals Ġ&& ĠhashCode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit File ( file : ĠPsi File ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġqueue . clear () ĊĠĠĠĠĠĠĠ Ġsuper . visit File ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class Or Object ( class Or Object : ĠK t Class Or Object ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġclass Or Object Ġas ? ĠK t Class ĊĠĠĠĠĠĠĠ Ġif Ġ( klass Ġ!= Ġnull Ġ&& Ġklass . is Data ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġqueue . push ( Violation Holder ()) ĊĠĠĠĠĠĠĠ Ġsuper . visit Class Or Object ( class Or Object ) ĊĠĠĠĠĠĠĠ Ġif Ġ( queue . pop (). violation ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport ( Code S mell ( issue , ĠEntity . from ( class Or Object ), Ġ" A Ġclass Ġshould Ġalways Ġoverride ĠhashCode Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" when Ġoverriding Ġequals Ġand Ġthe Ġother Ġway Ġaround .")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Named Function ( function : ĠK t Named Function ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! function . is TopLevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Equals Function ()) Ġqueue . peek (). equals Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is HashCode Function ()) Ġqueue . peek (). hashCode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠMAX IMUM _ EXPECTED _ NE ST ED _ CLASSES Ġ= Ġ 5 Ċ