package Ġorg . cq fn . di kt at . rule set . rules Ċ Ċ import Ġcom . p interest . kt lint . core . Kt Lint Ċ import Ġcom . p interest . kt lint . core . Rule Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . BLOCK _ COMMENT Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . CLASS Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . CLASS _ BODY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . CLASS _ INITIAL IZER Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . COMP AN ION _ KEYWORD Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . CONST _ KEYWORD Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . EOL _ COMMENT Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . FILE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . FUN Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . K DOC Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . LATE INIT _ KEYWORD Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . MODI FIER _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . OBJECT _ DECL AR ATION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . PRIVATE _ KEYWORD Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . PROPERTY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . REFERENCE _ EXPRESSION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . SECOND ARY _ CON STRUCTOR Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . WHITE _ SPACE Ċ import Ġcom . p interest . kt lint . core . ast . next Sibling Ċ import Ġcom . p interest . kt lint . core . ast . parent Ċ import Ġcom . p interest . kt lint . core . ast . prev Sibling Ċ import Ġorg . cq fn . di kt at . common . config . rules . Rules Config Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . BLANK _ LINE _ B ETWEEN _ PROPERTIES Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . WRONG _ ORDER _ IN _ CLASS _ LIKE _ STRUCTURE S Ċ import Ġorg . cq fn . di kt at . rule set . utils . findAll Nodes With Specific Type Ċ import Ġorg . cq fn . di kt at . rule set . utils . find Leaf With Specific Type Ċ import Ġorg . cq fn . di kt at . rule set . utils . getIdentifier Name Ċ import Ġorg . cq fn . di kt at . rule set . utils . handle Incorrect Order Ċ import Ġorg . cq fn . di kt at . rule set . utils . leave Exactly Num New Lines Ċ import Ġorg . cq fn . di kt at . rule set . utils . logger Property Regex Ċ import Ġorg . cq fn . di kt at . rule set . utils . move Child Before Ċ import Ġorg . jetbrains . kotlin . com . intellij . lang . AST Node Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . tree . Token Set Ċ Ċ /** Ċ Ġ* ĠRule Ġthat Ġchecks Ġorder Ġof Ġdeclarations Ġinside Ġclasses , Ġinterfaces Ġand Ġobjects . Ċ Ġ*/ Ċ class ĠClass Like Structures Order Rule Ġ: ĠRule (" class - like - structures ") Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfig Rules : ĠList < Rules Config > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġemit Warn : Ġ(( offset : ĠInt , ĠerrorMessage : ĠString , Ġcan Be Auto Correct ed : ĠBoolean ) Ġ-> ĠUnit ) ĊĠĠĠ Ġprivate Ġvar Ġis Fix Mode : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠAST Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Correct : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠK t Lint . Params , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit : Ġ( offset : ĠInt , ĠerrorMessage : ĠString , Ġcan Be Auto Correct ed : ĠBoolean ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig Rules Ġ= Ġparams . get D ik tat Config Rules () ĊĠĠĠĠĠĠĠ Ġemit Warn Ġ= Ġemit ĊĠĠĠĠĠĠĠ Ġis Fix Mode Ġ= Ġauto Correct ĊĊĠĠĠĠĠĠĠ Ġif Ġ( node . elementType Ġ== ĠCLASS _ BODY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Declarations Order In Class ( node ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( node . elementType Ġ== ĠPROPERTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck New Lines Before Property ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Declarations Order In Class ( node : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Properties Ġ= Ġnode . getChildren ( Token Set . create ( PROPERTY )) ĊĠĠĠĠĠĠĠ Ġval Ġconst Properties Ġ= Ġall Properties . filter Ġ{ Ġit . find Leaf With Specific Type ( CONST _ KEYWORD ) Ġ!= Ġnull Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġlate Init Properties Ġ= Ġall Properties . filter Ġ{ Ġit . find Leaf With Specific Type ( LATE INIT _ KEYWORD ) Ġ!= Ġnull Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġlog gers Ġ= Ġall Properties . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . find Child ByType ( MODI FIER _ LIST ) Ġ== Ġnull Ġ|| Ġit . find Leaf With Specific Type ( PRIVATE _ KEYWORD ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . getIdentifier Name () !!. text . contains ( logger Property Regex ) ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġall Properties . filter Ġ{ Ġit Ġ! in Ġlate Init Properties Ġ&& Ġit Ġ! in Ġlog gers Ġ&& Ġit Ġ! in Ġconst Properties Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġinit Blocks Ġ= Ġnode . getChildren ( Token Set . create ( CLASS _ INITIAL IZER )). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġnode . getChildren ( Token Set . create ( SECOND ARY _ CON STRUCTOR )). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġnode . getChildren ( Token Set . create ( FUN )). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġ( used Classes , Ġunused Classes ) Ġ= Ġnode . getChildren ( Token Set . create ( CLASS )). partition Ġ{ Ġclass Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Node . getIdentifier Name ()?. let Ġ{ Ġidentifier Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . parent ( FILE ) !!. findAll Nodes With Specific Type ( REFERENCE _ EXPRESSION ). any Ġ{ Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . parent ({ Ġit Ġ== Ġclass Node Ġ}) Ġ== Ġnull Ġ&& Ġref . text . contains ( identifier Node . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġit . first . to Mutable List () Ġto Ġit . second . to Mutable List () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Ġ= Ġnode . getChildren ( Token Set . create ( OBJECT _ DECL AR ATION )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . find Child ByType ( MODI FIER _ LIST )?. find Leaf With Specific Type ( COMP AN ION _ KEYWORD ) Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= ĠBlocks ( All Properties ( log gers , Ġconst Properties , Ġproperties , Ġlate Init Properties ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Blocks , Ġconstructors , Ġmethods , Ġused Classes , ĠlistOf NotNull ( comp anion ). to Mutable List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunused Classes ) ĊĊĠĠĠĠĠĠĠ Ġblocks . all Block Flatten ed (). reversed (). handle Incorrect Order ( blocks :: getS ibling Blocks ) Ġ{ Ġast Node , Ġbefore This Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWR ONG _ ORDER _ IN _ CLASS _ LIKE _ STRUCTURE S . warn And Fix ( config Rules , Ġemit Warn , Ġis Fix Mode , Ġast Node . elementType . toString () Ġ+ Ġ": Ġ" Ġ+ Ġast Node . text , Ġast Node . start Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplacement Ġ= Ġnode . move Child Before ( ast Node , Ġbefore This Node , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplacement . old Nodes . forEach Indexed Ġ{ Ġidx , Ġold Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks . all Blocks (). find Ġ{ Ġold Node Ġin Ġit Ġ} ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ indexOf ( old Node )] Ġ= Ġreplacement . new Nodes [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck New Lines Before Property ( node : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Property Ġ= Ġnode . prev Sibling Ġ{ Ġit . elementType Ġ== ĠPROPERTY Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( previous Property Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment On This Ġ= Ġnode . find Child ByType ( Token Set . create ( K DOC , ĠE OL _ COMMENT , ĠBLOCK _ COMMENT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwhite Space Before Ġ= Ġprevious Property . next Sibling Ġ{ Ġit . elementType Ġ== ĠWH ITE _ SPACE Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Required New Lines Ġ= Ġif Ġ( comment On This Ġ== Ġnull ) Ġ 1 Ġelse Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( white Space Before . text . count Ġ{ Ġit Ġ== Ġ'\ n ' Ġ} Ġ!= Ġn Required New Lines ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBL ANK _ LINE _ B ETWEEN _ PROPERTIES . warn And Fix ( config Rules , Ġemit Warn , Ġis Fix Mode , Ġnode . getIdentifier Name () !!. text , Ġnode . start Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhite Space Before . leave Exactly Num New Lines ( n Required New Lines ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠAll Properties ( val Ġlog gers : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconst Properties : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlate Init Properties : ĠMutable List < AST Node >) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠBlocks ( val Ġall Properties : ĠAll Properties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Blocks : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructors : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethods : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġused Classes : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompanion : ĠMutable List < AST Node >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunused Classes : ĠMutable List < AST Node >) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( comp anion . size Ġin Ġ 0 .. 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġall Blocks () Ġ= Ġwith ( all Properties ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( log gers , Ġconst Properties , Ġproperties , Ġlate Init Properties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Blocks , Ġconstructors , Ġmethods , Ġused Classes , Ġcompanion , Ġunused Classes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġall Block Flatten ed () Ġ= Ġall Blocks (). flatten () ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Sibling Blocks ( node : ĠAST Node ): ĠPair < AST Node ?, ĠAST Node > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( node Ġin Ġall Block Flatten ed ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Element Ġ= Ġall Block Flatten ed (). last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġall Blocks (). indexOf First Ġ{ Ġnode Ġin Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( all Blocks (). sub List ( 0 , Ġidx ) Ġto Ġall Blocks (). sub List ( idx Ġ+ Ġ 1 , Ġall Blocks (). size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . first . flatten () Ġto Ġit . second . flatten () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . first . first OrNull () Ġto Ġ( it . second . first OrNull () Ġ?: Ġlast Element . tree Next ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ