package Ġio . gitlab . art urb os ch . de te kt . rules . style Ċ Ċ 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 . Det ek t Visitor Ċ 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 . isOpen Ċ import Ġio . gitlab . art urb os ch . de te kt . rules . is Override Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Ċ import Ġorg . jetbrains . kotlin . psi . Kt Declaration Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . is Abstract Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . is Protected Ċ Ċ /** Ċ Ġ* ĠKotlin Ġclasses Ġare Ġ` final ` Ġby Ġdefault . ĠThus Ġclasses Ġwhich Ġare Ġnot Ġmarked Ġas Ġ` open ` Ġshould Ġnot Ġcontain Ġany Ġ` protected ` Ċ Ġ* Ġmembers . ĠConsider Ġusing Ġ` private ` Ġor Ġ` internal ` Ġmodifiers Ġinstead . Ċ Ġ* Ċ Ġ* Ġ< non comp liant > Ċ Ġ* Ġclass ĠProtected Member In Final Class Ġ{ Ċ Ġ* ĠĠĠĠ Ġprotected Ġvar Ġi Ġ= Ġ 0 Ċ Ġ* Ġ} Ċ Ġ* Ġ</ non comp liant > Ċ Ġ* Ċ Ġ* Ġ< comp liant > Ċ Ġ* Ġclass ĠProtected Member In Final Class Ġ{ Ċ Ġ* ĠĠĠĠ Ġprivate Ġvar Ġi Ġ= Ġ 0 Ċ Ġ* Ġ} Ċ Ġ* Ġ</ comp liant > Ċ Ġ* Ċ Ġ* Ġ@ author Ġsch alk ms Ċ Ġ* Ġ@ author ĠMar vin ĠR amin Ċ Ġ*/ Ċ class ĠProtected Member In Final Class ( config : ĠConfig Ġ= ĠConfig . empty ) Ġ: ĠRule ( config ) Ġ{ ĊĊ ĉ override Ġval Ġissue Ġ= ĠIssue ( java Class . simple Name , ĠSeverity . Warning , Ċĉĉ ĉ " Member Ġwith Ġprotected Ġvisibility Ġin Ġfinal Ġclass Ġis Ġprivate . ĠConsider Ġusing Ġprivate Ġor Ġinternal Ġas Ġmodifier .", Ċĉĉ ĉ De bt . FI VE _ MIN S ) ĊĊ ĉ private Ġval Ġvisitor Ġ= ĠDeclaration Visitor () ĊĊ ĉ /** Ċĉ Ġ* ĠOnly Ġclasses Ġand Ġcompanion Ġobjects Ġcan Ġcontain Ġprotected Ġmembers . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġvisit Class ( klass : ĠK t Class ) Ġ{ Ċĉ ĉ if Ġ( has Modifiers ( klass )) Ġ{ Ċĉĉ ĉ klass . primary Constructor ?. accept ( visitor ) Ċĉĉ ĉ klass . body ?. declarations ?. forEach Ġ{ Ġit . accept ( visitor ) Ġ} Ċĉĉ ĉ klass . comp anion Objects . forEach Ġ{ Ġit . accept ( visitor ) Ġ} Ċĉ ĉ } Ċĉ ĉ super . visit Class ( klass ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġhas Modifiers ( klass : ĠK t Class ): ĠBoolean Ġ{ Ċĉ ĉ val Ġis Not Abstract Ġ= Ġ! klass . is Abstract () Ċĉ ĉ val Ġis Final Ġ= Ġ! klass . isOpen () Ċĉ ĉ val Ġis Not Se aled Ġ= Ġ! klass . is Se aled () Ċĉ ĉ return Ġis Not Abstract Ġ&& Ġis Final Ġ&& Ġis Not Se aled Ċ ĉ } ĊĊ ĉ internal Ġinner Ġclass ĠDeclaration Visitor Ġ: ĠDet ek t Visitor () Ġ{ ĊĊĉ ĉ override Ġfun Ġvisit Declaration ( dcl : ĠK t Declaration ) Ġ{ Ċĉĉ ĉ if Ġ( dcl . is Protected () Ġ&& Ġ! dcl . is Override ()) Ġ{ Ċĉĉĉ ĉ report ( Code S mell ( issue , ĠEntity . from ( dcl ), Ġissue . description )) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ