package Ġorg . cq fn . di kt at . rule set . rules . chapter 3 . files Ċ Ċ import Ġorg . cq fn . di kt at . common . config . rules . Rule Configuration Ċ import Ġorg . cq fn . di kt at . common . config . rules . Rules Config Ċ import Ġorg . cq fn . di kt at . common . config . rules . get Common Configuration Ċ import Ġorg . cq fn . di kt at . common . config . rules . get Rule Config Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . FILE _ CONTAIN S _ ONLY _ COMMENTS Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . FILE _ IN CORRECT _ BLOCKS _ ORDER Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . FILE _ NO _ BLANK _ LINE _ B ETWEEN _ BLOCKS Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . FILE _ UN ORDER ED _ IMPORT S Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . FILE _ W IL DC ARD _ IMPORT S Ċ import Ġorg . cq fn . di kt at . rule set . constants . Warnings . UNUSED _ IMPORT Ċ import Ġorg . cq fn . di kt at . rule set . rules . D ik tat Rule Ċ import Ġorg . cq fn . di kt at . rule set . rules . chapter 1 . Package Naming . Companion . PACKAGE _ SEPARATOR Ċ import Ġorg . cq fn . di kt at . rule set . utils . Standard Platforms Ċ import Ġorg . cq fn . di kt at . rule set . utils . copyright Words Ċ import Ġorg . cq fn . di kt at . rule set . utils . findAll Desc endants With Specific Type Ċ import Ġorg . cq fn . di kt at . rule set . utils . handle Incorrect Order Ċ import Ġorg . cq fn . di kt at . rule set . utils . ignore Imports Ċ import Ġorg . cq fn . di kt at . rule set . utils . move Child Before Ċ import Ġorg . cq fn . di kt at . rule set . utils . operator Map Ċ Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . BLOCK _ COMMENT Ċ 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 . FILE _ AN NOT ATION _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . IMPORT _ DIRECT IVE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . IMPORT _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . K DOC Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . OPERATION _ REFERENCE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . PACKAGE _ DIRECT IVE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . REFERENCE _ EXPRESSION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . WHITE _ SPACE Ċ import Ġcom . p interest . kt lint . core . ast . children Ċ import Ġcom . p interest . kt lint . core . ast . is Part Of Ċ import Ġcom . p interest . kt lint . core . ast . is Part Of Comment Ċ import Ġcom . p interest . kt lint . core . ast . is WhiteSpace Ċ import Ġcom . p interest . kt lint . core . ast . next Sibling Ċ import Ġcom . p interest . kt lint . core . ast . prev Sibling Ċ import Ġorg . jetbrains . kotlin . com . intellij . lang . AST Node Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . impl . source . tree . Leaf Psi Element Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . impl . source . tree . Psi WhiteSpace Impl Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . tree . Token Set Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Import Directive Ċ import Ġorg . jetbrains . kotlin . psi . Kt Package Directive Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . siblings Ċ Ċ /** Ċ Ġ* ĠVisitor Ġfor Ġchecking Ġinternal Ġfile Ġstructure . Ċ Ġ* Ġ 1 . ĠChecks Ġfile Ġcontains Ġnot Ġonly Ġcomments Ċ Ġ* Ġ 2 . ĠEns ures Ġthe Ġfollowing Ġblocks Ġorder : ĠCopyright , ĠHeader ĠK doc , Ġ@ file Ġannotation , Ġpackage Ġname , ĠImport Ġstatements , Ċ Ġ* ĠĠĠ Ġtop Ġclass Ġheader Ġand Ġtop Ġfunction Ġheader Ġcomments , Ġtop - level Ġclasses Ġor Ġtop - level Ġfunctions Ċ Ġ* Ġ 3 . ĠEns ures Ġthere Ġis Ġa Ġblank Ġline Ġbetween Ġthese Ġblocks Ċ Ġ* Ġ 4 . ĠEns ures Ġimports Ġare Ġordered Ġalphabet ically Ġwithout Ġblank Ġlines Ċ Ġ* Ġ 5 . ĠEns ures Ġthere Ġare Ġno Ġwildcard Ġimports Ċ Ġ*/ Ċ class ĠFile Structure Rule ( config Rules : ĠList < Rules Config >) Ġ: ĠD ik tat Rule ( ĊĠĠĠ ĠNAME _ ID , ĊĠĠĠ Ġconfig Rules , ĊĠĠĠ ĠlistOf ( FILE _ CONTAIN S _ ONLY _ COMMENTS , ĠFILE _ IN CORRECT _ BLOCKS _ ORDER , ĠFILE _ NO _ BLANK _ LINE _ B ETWEEN _ BLOCKS , ĊĠĠĠĠĠĠĠ ĠFILE _ UN ORDER ED _ IMPORT S , ĠFILE _ W IL DC ARD _ IMPORT S , ĠUN USED _ IMPORT ), Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdomain Name Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig Rules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Common Configuration () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. domain Name ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġstandard Imports As Name Ġ= ĠStandard Platforms ĊĠĠĠĠĠĠĠ Ġ. values () ĊĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit Ġto Ġit . packages Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġ(_, Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . map Ġ{ Ġit . split ( PACKAGE _ SEPARATOR ). map ( Name :: identifier ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġref Set : ĠMutable Set < String > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġprivate Ġvar ĠpackageName Ġ= Ġ"" ĊĠĠĠĠĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThere Ġare Ġgroups Ġof Ġmethods , Ġwhich Ġshould Ġbe Ġexcluded Ġfrom Ġusage Ġcheck Ġwithout Ġtype Ġresolution . ĊĠĠĠĠ Ġ* Ġ` component N ` Ġis Ġa Ġmethod Ġfor ĠN - th Ġcomponent Ġin Ġdestruct uring Ġdeclarations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġignore Imports Patterns Ġ= Ġset Of (" component \\ d +". to Regex ()) ĊĊĠĠĠ Ġoverride Ġfun Ġlogic ( node : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node . elementType Ġ== ĠFILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwildcard Imports Config Ġ= ĠW ild Card Imports Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . config Rules . get Rule Config ( FILE _ W IL DC ARD _ IMPORT S )?. configuration Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimports Grouping Config Ġ= ĠImports Grouping Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . config Rules . get Rule Config ( FILE _ UN ORDER ED _ IMPORT S )?. configuration Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Unused Import ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . find Child ByType ( IMPORT _ LIST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġcheck Imports Order ( it , Ġwildcard Imports Config , Ġimports Grouping Config ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check File Has Code ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Code Blocks Order And Empty Lines ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" FUNCTION _ BOOLEAN _ PREFIX ") ĊĠĠĠ Ġprivate Ġfun Ġcheck File Has Code ( node : ĠAST Node ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Tokens Ġ= ĠToken Set . and Not ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken Set . ANY , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken Set . create ( WHITE _ SPACE , ĠK DOC , ĠBLOCK _ COMMENT , ĠE OL _ COMMENT , ĠPACK AGE _ DIRECT IVE , ĠIMPORT _ LIST ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġhas Code Ġ= Ġnode . getChildren ( code Tokens ). isNotEmpty () ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfree Text Ġ= Ġif Ġ( node . text . isEmpty ()) Ġ" file Ġis Ġempty " Ġelse Ġ" file Ġcontains Ġno Ġcode " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ CONTAIN S _ ONLY _ COMMENTS . warn ( config Rules , Ġemit Warn , Ġis Fix Mode , Ġfree Text , Ġnode . start Offset , Ġnode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress ( ĊĠĠĠĠĠĠĠ Ġ" Complex Method ", ĊĠĠĠĠĠĠĠ Ġ" TOO _ LONG _ FUNCTION ", ĊĠĠĠĠĠĠĠ Ġ" Spread Operator " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġfun Ġcheck Code Blocks Order And Empty Lines ( node : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFrom ĠK t File . kt : Ġ' scripts Ġhave Ġno Ġpackage Ġdirective , Ġall Ġother Ġfiles Ġmust Ġhave Ġpackage Ġdirectives '. ĊĠĠĠĠĠĠĠ Ġ// ĠKotlin Ġcompiler Ġitself Ġen forces Ġit 's Ġposition Ġin Ġthe Ġfile Ġif Ġit Ġis Ġpresent . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġpackage Ġdirective Ġis Ġmissing Ġin Ġ. kt Ġfile Ġ( default Ġpackage ), Ġthe Ġnode Ġis Ġstill Ġpresent Ġin Ġthe ĠAST . ĊĠĠĠĠĠĠĠ Ġval Ġpackage Directive Node Ġ= Ġ( node . psi Ġas ĠK t File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. package Directive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take Unless Ġ{ Ġit . is Root Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . node ĊĠĠĠĠĠĠĠ Ġ// ĠThere Ġis Ġa Ġprivate Ġproperty Ġnode . psi . import Lists , Ġbut Ġit 's Ġsize Ġcan 't Ġbe Ġ> Ġ 1 Ġin Ġvalid Ġkotlin Ġcode . ĠIt Ġexists Ġto Ġhelp Ġin Ġsituations ĊĠĠĠĠĠĠĠ Ġ// Ġwhen , Ġe . g . Ġmerge Ġconflict Ġmarker Ġbreaks Ġthe Ġimports Ġlist . ĠWe Ġshouldn 't Ġhandle Ġthis Ġsituation Ġhere . ĊĠĠĠĠĠĠĠ Ġval Ġimports List Ġ= Ġ( node . psi Ġas ĠK t File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. import List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . imports . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . node ĊĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġnode Ġwill Ġbe Ġan Ġanchor Ġwith Ġrespect Ġto Ġwhich Ġwe Ġwill Ġlook Ġfor Ġall Ġother Ġnodes ĊĠĠĠĠĠĠĠ Ġval Ġfirst Code Node Ġ= Ġpackage Directive Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġimports List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġnode . children (). first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtaking Ġnodes Ġwith Ġactual Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . is WhiteSpace () Ġ&& Ġ! it . is Part Of Comment () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġnot Ġthe Ġones Ġwe Ġare Ġgoing Ġto Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . elementType Ġ!= ĠFILE _ AN NOT ATION _ LIST Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġare Ġhere , Ġthen ĠIMPORT _ LIST Ġeither Ġis Ġnot Ġpresent Ġin Ġthe ĠAST , Ġor Ġis Ġempty . ĠEither Ġway , Ġwe Ġdon 't Ġneed Ġto Ġselect Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . elementType Ġ!= ĠIMPORT _ LIST Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġare Ġhere , Ġthen Ġpackage Ġis Ġdefault Ġand Ġwe Ġdon 't Ġneed Ġto Ġselect Ġthe Ġempty ĠPACK AGE _ DIRECT IVE Ġnode . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . elementType Ġ!= ĠPACK AGE _ DIRECT IVE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġ Ġ// Ġat Ġthis Ġpoint Ġit Ġmeans Ġthe Ġfile Ġcontains Ġonly Ġcomments ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġconsider Ġthe Ġfirst Ġblock Ġcomment Ġof Ġthe Ġfile Ġto Ġbe Ġthe Ġone Ġthat Ġpossibly Ġcontains Ġcopyright Ġinformation . ĊĠĠĠĠĠĠĠ Ġvar Ġcopyright Comment Ġ= Ġfirst Code Node . prev Sibling Ġ{ Ġit . elementType Ġ== ĠBLOCK _ COMMENT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġblock Comment Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopyright Words . any Ġ{ Ġblock Comment Node . text . contains ( it , Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġfirst Code Node Ġcould Ġbe : ĊĠĠĠĠĠĠĠ Ġ// Ġ* Ġpackage Ġdirective Ġ- Ġin Ġthis Ġcase Ġwe Ġlooking Ġfor Ġk doc Ġbefore Ġpackage Ġdirective ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġif Ġit Ġdoesn 't Ġexist , Ġaddition ally Ġlooking Ġfor Ġk doc Ġbefore Ġimports Ġlist ĊĠĠĠĠĠĠĠ Ġ// Ġ* Ġimports Ġlist Ġor Ġactual Ġcode Ġ- Ġif Ġthere Ġis Ġno Ġk doc Ġbefore Ġit , Ġsuppose Ġthat Ġit Ġis Ġabsent Ġin Ġfile ĊĠĠĠĠĠĠĠ Ġvar Ġheader K doc Ġ= Ġfirst Code Node . prev Sibling Ġ{ Ġit . elementType Ġ== ĠK DOC Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġif Ġ( first Code Node Ġ== Ġpackage Directive Node ) Ġimports List ?. prev Sibling Ġ{ Ġit . elementType Ġ== ĠK DOC Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ// ĠAn notations Ġwith Ġtarget ` file ` Ġcan Ġonly Ġbe Ġplaced Ġbefore Ġ` package ` Ġdirective . ĊĠĠĠĠĠĠĠ Ġvar Ġfile Annotations Ġ= Ġnode . find Child ByType ( FILE _ AN NOT ATION _ LIST ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġalso Ġcollect Ġall Ġother Ġelements Ġthat Ġare Ġplaced Ġon Ġtop Ġof Ġthe Ġfile . ĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġmay Ġbe Ġother Ġcomments , Ġso Ġwe Ġjust Ġplace Ġthem Ġbefore Ġthe Ġcode Ġstarts . ĊĠĠĠĠĠĠĠ Ġval Ġother Nodes Before Code Ġ= Ġfirst Code Node . siblings ( forward Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is WhiteSpace () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġcopyright Comment Ġ|| Ġit Ġ== Ġheader K doc Ġ|| Ġit Ġ== Ġfile Annotations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reversed () ĊĊĠĠĠĠĠĠĠ Ġ// Ġchecking Ġorder ĊĠĠĠĠĠĠĠ ĠlistOf NotNull ( copyright Comment , Ġheader K doc , Ġfile Annotations , Ġ* other Nodes Before Code . to Typed Array ()). handle Incorrect Order ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Sibling Blocks ( copyright Comment , Ġheader K doc , Ġfile Annotations , Ġfirst Code Node , Ġother Nodes Before Code ) ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġast Node , Ġbefore This Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ IN CORRECT _ BLOCKS _ ORDER . warn And Fix ( config Rules , Ġemit Warn , Ġis Fix Mode , Ġast Node . text . lines (). first (), Ġast Node . start Offset , Ġast Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġnode . move Child Before ( ast Node , Ġbefore This Node , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . new Nodes . first (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġre assign Ġvalues Ġto Ġthe Ġnodes Ġthat Ġcould Ġhave Ġbeen Ġmoved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBLOCK _ COMMENT Ġ-> Ġcopyright Comment Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK DOC Ġ-> Ġheader K doc Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ AN NOT ATION _ LIST Ġ-> Ġfile Annotations Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġast Node . tree Next ?. let Ġ{ Ġnode . replace Child ( it , ĠPsi WhiteSpace Impl ("\ n \ n ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġchecking Ġempty Ġlines ĊĠĠĠĠĠĠĠ Ġinsert New lines Between Blocks ( listOf ( copyright Comment , Ġheader K doc , Ġfile Annotations , Ġpackage Directive Node , Ġimports List )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Unsafe Call On Nullable Type ") ĊĠĠĠ Ġprivate Ġfun Ġcheck Imports Order ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġwild Card Imports Config : ĠW ild Card Imports Config , ĊĠĠĠĠĠĠĠ Ġimports Grouping Config : ĠImports Grouping Config ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġnode . getChildren ( Token Set . create ( IMPORT _ DIRECT IVE )). toList () ĊĠĠĠĠĠĠĠ Ġ// Ġimport Path Ġcan Ġbe Ġnull Ġif Ġimport Ġname Ġcannot Ġbe Ġparsed , Ġwhich Ġshould Ġbe Ġa Ġvery Ġrare Ġcase , Ġtherefore Ġ!! Ġshould Ġbe Ġsafe Ġhere ĊĠĠĠĠĠĠĠ Ġimports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . psi Ġas ĠK t Import Directive ). import Path !!. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis All Under Ġ&& ĠtoString () Ġ! in Ġwild Card Imports Config . allowed W ild cards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĠFILE _ W IL DC ARD _ IMPORT S . warn ( config Rules , Ġemit Warn , Ġis Fix Mode , Ġit . text , Ġit . start Offset , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsorted Imports Groups Ġ= Ġif Ġ( imports Grouping Config . use Recommended Imports Order ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre group Imports ( imports . map Ġ{ Ġit . psi Ġas ĠK t Import Directive Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġgroup Ġ-> Ġgroup . map Ġ{ Ġit . node Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( imports ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġgroup Ġ-> Ġgroup . sorted By Ġ{ Ġit . text Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( sorted Imports Groups . flatten () Ġ!= Ġimports ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ UN ORDER ED _ IMPORT S . warn And Fix ( config Rules , Ġemit Warn , Ġis Fix Mode , Ġ"${ sorted Imports Groups . flatten (). first (). text } ...", Ġnode . start Offset , Ġnode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre arrange Imports ( node , Ġimports , Ġsorted Imports Groups ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Unsafe Call On Nullable Type ") ĊĠĠĠ Ġprivate Ġfun Ġcheck Unused Import ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll References ( node ) ĊĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġ( node . find Child ByType ( PACKAGE _ DIRECT IVE )?. psi Ġas ĠK t Package Directive ). qualified Name ĊĠĠĠĠĠĠĠ Ġnode . find Child ByType ( IMPORT _ LIST )?. getChildren ( Token Set . create ( IMPORT _ DIRECT IVE )) ?. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ Ġimport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt Import Directive Ġ= Ġimport . psi Ġas ĠK t Import Directive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimport Name Ġ= Ġkt Import Directive . import Path ?. imported Name ?. asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimport Path Ġ= Ġkt Import Directive . import Path ?. path Str !! Ġ Ġ// Ġimport Path Ġ- Ġif NO t Parsed Ġ& ĠNullable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kt Import Directive . alias Name Ġ== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName . isNotEmpty () Ġ&& Ġimport Path . startsWith ("$ packageName .") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Path . substring ( packageName . length Ġ+ Ġ 1 ). indexOf ('.') Ġ== Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġbranch Ġcorresponds Ġto Ġimports Ġfrom Ġthe Ġsame Ġpackage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Import ( import Path , Ġnode , Ġkt Import Directive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( import Name Ġ!= Ġnull Ġ&& Ġ! ref Set . contains ( import Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFix me : Ġoperator Map Ġimports Ġand Ġ` getValue ` Ġshould Ġbe Ġdeleted Ġif Ġunused , Ġbut Ġwe Ġcan 't Ġdetect Ġfor Ġsure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Import Be Ignored Ġ= Ġignore Imports . contains ( import Name ) Ġ|| Ġignore Imports Patterns . any Ġ{ Ġit . matches ( import Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! should Import Be Ignored ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġimport Ġis Ġnot Ġused Ġanywhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Import ( import Path , Ġnode , Ġkt Import Directive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Import ( ĊĠĠĠĠĠĠĠ Ġimport Path : ĠString , ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġkt Import Directive : ĠK t Import Directive ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUN USED _ IMPORT . warn And Fix ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Rules , Ġemit Warn , Ġis Fix Mode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ import Path Ġ- Ġunused Ġimport ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . start Offset , Ġnode ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġkt Import Directive . delete () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠfindAll References ( node : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode . findAll Desc endants With Specific Type ( OPERATION _ REFERENCE ). forEach Ġ{ Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ref . is Part Of ( IMPORT _ DIRECT IVE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreferences Ġ= Ġoperator Map . filter Values Ġ{ Ġref . text Ġin Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( references . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferences . keys . forEach Ġ{ Ġkey Ġ-> Ġref Set . add ( key ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġneeded Ġto Ġcheck Ġin fix Ġfunctions Ġthat Ġre late Ġto Ġoperation Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref Set . add ( ref . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode . findAll Desc endants With Specific Type ( REFERENCE _ EXPRESSION ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Part Of ( IMPORT _ DIRECT IVE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġimported Name Ġmethod Ġremoves Ġthe Ġquotes , Ġbut Ġthe Ġnode . text Ġmethod Ġdoes Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref Set . add ( it . text . replace (" `", Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre arrange Imports ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġimports : ĠList < AST Node >, ĊĠĠĠĠĠĠĠ Ġsorted Imports Groups : ĠList < List < AST Node >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( node . elementType Ġ== ĠIMPORT _ LIST ) ĊĠĠĠĠĠĠĠ Ġ// Ġmove Ġall Ġcommented Ġlines Ġamong Ġimport Ġbefore Ġimports Ġblock ĊĠĠĠĠĠĠĠ Ġnode . getChildren ( Token Set . create ( EOL _ COMMENT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tree Parent . addChild ( it . clone () Ġas ĠAST Node , Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tree Parent . addChild ( Psi WhiteSpace Impl ("\ n "), Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnode . remove Range ( imports . first (), Ġimports . last ()) ĊĠĠĠĠĠĠĠ Ġsorted Imports Groups . filter Not Ġ{ Ġit . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Indexed Ġ{ Ġgroup Index , Ġgroup Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . forEach Indexed Ġ{ Ġindex , Ġimport Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . addChild ( import Node , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġgroup . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . addChild ( Psi WhiteSpace Impl ("\ n "), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( group Index Ġ!= Ġsize Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . addChild ( Psi WhiteSpace Impl ("\ n \ n "), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert New lines Between Blocks ( blocks : ĠList < AST Node ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblocks . forEach Ġ{ Ġast Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġpackage Ġdirective Ġis Ġmissing , Ġnode Ġis Ġstill Ġpresent , Ġbut Ġit 's Ġtext Ġis Ġempty , Ġso Ġwe Ġneed Ġto Ġcheck Ġtree Next Ġto Ġget Ġmeaningful Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠ Ġast Node ?. next Sibling Ġ{ Ġit . text . isNotEmpty () Ġ} ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elementType Ġ== ĠWH ITE _ SPACE Ġ&& Ġtext . count Ġ{ Ġit Ġ== Ġ'\ n ' Ġ} Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ NO _ BLANK _ LINE _ B ETWEEN _ BLOCKS . warn And Fix ( config Rules , Ġemit Warn , Ġis Fix Mode , Ġast Node . text . lines (). first (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġast Node . start Offset , Ġast Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this Ġas ĠLeaf Psi Element ). raw Replace With Text ("\ n \ n ${ text . replace ("\ n ", Ġ"") }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġpair Ġof Ġnodes Ġbetween Ġwhich Ġ[ this ] Ġnode Ġshould Ġbe Ġplaced , Ġi . e . Ġafter Ġthe Ġfirst Ġand Ġbefore Ġthe Ġsecond Ġelement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠAST Node . getS ibling Blocks ( ĊĠĠĠĠĠĠĠ Ġcopyright Comment : ĠAST Node ?, ĊĠĠĠĠĠĠĠ Ġheader K doc : ĠAST Node ?, ĊĠĠĠĠĠĠĠ Ġfile Annotations : ĠAST Node ?, ĊĠĠĠĠĠĠĠ Ġfirst Code Node : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġother Nodes Before First : ĠList < AST Node > ĊĠĠĠ Ġ): ĠPair < AST Node ?, ĠAST Node > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcopyright Comment Ġ-> Ġnull Ġto ĠlistOf NotNull ( header K doc , Ġfile Annotations , Ġother Nodes Before First . first OrNull (), Ġfirst Code Node ). first () ĊĠĠĠĠĠĠĠ Ġheader K doc Ġ-> Ġcopyright Comment Ġto Ġ( file Annotations Ġ?: Ġother Nodes Before First . first OrNull () Ġ?: Ġfirst Code Node ) ĊĠĠĠĠĠĠĠ Ġfile Annotations Ġ-> Ġ( header K doc Ġ?: Ġcopyright Comment ) Ġto Ġ( other Nodes Before First . first OrNull () Ġ?: Ġfirst Code Node ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( header K doc Ġ?: Ġcopyright Comment ) Ġto Ġfirst Code Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" TYPE _ ALIAS ", Ġ" Unsafe Call On Nullable Type ") ĊĠĠĠ Ġprivate Ġfun Ġre group Imports ( imports : ĠList < Kt Import Directive >): ĠList < List < Kt Import Directive >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( android , Ġnot Android ) Ġ= Ġimports . partition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Standard ( Standard Platforms . ANDROID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( own Domain , Ġtmp ) Ġ= Ġdomain Name ?. let Ġ{ Ġdomain Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Android . partition Ġ{ Ġimport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. import Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . fq Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . path Segments () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . zip ( domain Name . split ( PACKAGE _ SEPARATOR ). map ( Name :: identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . all Ġ{ Ġit . first Ġ== Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠPair ( emptyList (), Ġnot Android ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( others , Ġjava And Kotlin ) Ġ= Ġtmp . partition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . is Standard ( Standard Platforms . JAVA ) Ġ&& Ġ! it . is Standard ( Standard Platforms . K OT LIN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( java , Ġkotlin ) Ġ= Ġjava And Kotlin . partition Ġ{ Ġit . is Standard ( Standard Platforms . JAVA ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( android , Ġown Domain , Ġothers , Ġjava , Ġkotlin ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠK t Import Directive . is Standard ( platform Name : ĠStandard Platforms ) Ġ= Ġstandard Imports As Name [ platform Name ]?. any Ġ{ Ġnames Ġ-> ĊĠĠĠĠĠĠĠ Ġnames . zip ( import Path ?. fq Name ?. path Segments () Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Ġ{ Ġit . first Ġ== Ġit . second Ġ} ĊĠĠĠ Ġ} Ġ?: Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Rule Configuration ] Ġfor Ġwildcard Ġimports ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠW ild Card Imports Config ( config : ĠMap < String , ĠString >) Ġ: ĠRule Configuration ( config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġlist Ġof Ġimports Ġthat Ġare Ġallowed Ġto Ġuse Ġwild cards . ĠInput Ġis Ġin Ġa Ġform Ġ" foo . bar .*, foo . baz .* ". ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġallowed W ild cards Ġ= Ġconfig [" allowed W ild cards "] ?. split (",") ?. map Ġ{ Ġit . trim () Ġ} Ġ?: Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Rule Configuration ] Ġfor Ġimports Ġgrouping Ġaccording Ġto Ġthe Ġrecommendation Ġfrom Ġd ik tat Ġcode Ġstyle ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠImports Grouping Config ( config : ĠMap < String , ĠString >) Ġ: ĠRule Configuration ( config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUse Ġimports Ġgrouping Ġaccording Ġto Ġrecommendation Ġ 3 . 1 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġuse Recommended Imports Order Ġ= Ġconfig [" use Recommended Imports Order "] ?. to Boolean () Ġ?: Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNAME _ ID Ġ= Ġ" ac q - file - structure " ĊĠĠĠ Ġ} Ċ } Ċ