package Ġcom . p interest . kt lint . rule set . standard Ċ Ċ import Ġcom . p interest . kt lint . core . Editor Config Ċ 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 Ċ import Ġcom . p interest . kt lint . core . ast . is Root Ċ import Ġcom . p interest . kt lint . rule set . standard . Import Ordering Rule . Companion . ASCII _ PATTERN Ċ import Ġcom . p interest . kt lint . rule set . standard . Import Ordering Rule . Companion . IDE A _ PATTERN Ċ import Ġcom . p interest . kt lint . rule set . standard . internal . import ordering . Import Sorter Ċ import Ġcom . p interest . kt lint . rule set . standard . internal . import ordering . Pattern Entry Ċ import Ġorg . jetbrains . kotlin . com . intellij . lang . AST Node Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . Psi WhiteSpace Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . impl . source . tree . Psi WhiteSpace Impl Ċ import Ġorg . jetbrains . kotlin . psi . Kt Import Directive Ċ Ċ /** Ċ Ġ* ĠImport Ġordering Ġis Ġconfigured Ġvia ĠEditor Config 's Ġcustom Ġproperty Ġ` kotlin _ imports _ layout `. ĠSupported Ġvalues : Ċ Ġ* Ġ* Ġ" idea " Ġ- Ġdefault ĠIntelliJ ĠIDEA 's Ġorder , Ġsee Ġ[ IDE A _ PATTERN ] Ċ Ġ* Ġ* Ġ" ascii " Ġ- Ġalphabet ical Ġorder Ġas Ġrecommended Ġin ĠAndroid 's ĠKotlin Ġstyle Ġguide , Ġsee Ġ[ ASCII _ PATTERN ] Ċ Ġ* Ġ* Ġcustom Ġ- Ġdefined Ġby Ġthe Ġfollowing Ġset Ġof Ġtokens . ĠTokens Ġcan Ġbe Ġcombined Ġtogether Ġin Ġa Ġgroup , Ġgroups / tokens Ġmust Ġbe Ġcomma Ġseparated : Ċ Ġ* Ġ Ġ* Ġ"*" Ġ- Ġwildcard Ġsymbol , Ġcan Ġbe Ġused Ġas Ġfollows : Ċ Ġ* ĠĠĠĠĠĠ 1 . ĠSingle , Ġmeaning Ġmatching Ġany Ġimport Ġ(< all Ġother Ġimports > Ġin ĠIDEA ) Ċ Ġ* ĠĠĠĠĠĠ 2 . ĠAfter Ġan Ġimport Ġpath , Ġe . g . Ġ" java .* " Ġor Ġ" kotlin . io .* " Ċ Ġ* ĠĠĠĠĠĠ 3 . ĠIn Ġconjunction Ġwith Ġ"^ " Ġoperator , Ġmeaning Ġmatching Ġany Ġalias Ġimport Ġ- Ġ"^ *" Ġ(< all Ġother Ġalias Ġimports > Ġin ĠIDEA ) Ċ Ġ* Ġ Ġ* Ġ" |" Ġ- Ġblank Ġline Ġsymbol . ĠOnly Ġsupported Ġsingle Ġblank Ġlines Ġbetween Ġimports . ĠMultiple Ġblank Ġlines Ġwill Ġbe Ġignored . ĠBl ank Ġlines Ġare Ġnot Ġallowed Ġoutside Ġof Ġimport Ġlist . Ċ Ġ* Ġ Ġ* Ġ"^ " Ġ- Ġalias Ġsymbol , Ġcan Ġbe Ġused Ġas Ġfollows : Ċ Ġ* ĠĠĠĠĠĠ 1 . ĠIn Ġfront Ġof Ġan Ġimport Ġpath , Ġmeaning Ġmatching Ġall Ġalias Ġimports Ġfrom Ġthis Ġpath , Ġe . g . Ġ"^ android .* " Ċ Ġ* ĠĠĠĠĠĠ 2 . ĠIn Ġconjunction Ġwith Ġ"*" Ġoperator , Ġmeaning Ġmatching Ġany Ġalias Ġimport Ġ- Ġ"^ *" Ġ(< all Ġother Ġalias Ġimports > Ġin ĠIDEA ) Ċ Ġ* Ġ Ġ* Ġimport Ġpaths Ġ- Ġthese Ġcan Ġbe Ġfull Ġpaths , Ġe . g . Ġ" java . util . List " Ġas Ġwell Ġas Ġwildcard Ġpaths , Ġe . g . Ġ" kotlin .* " Ċ Ġ* Ċ Ġ* ĠIn Ġcase Ġthe Ġcustom Ġproperty Ġis Ġnot Ġprovided , Ġthe Ġrule Ġdefaults Ġto Ġ" ascii " Ġstyle Ġin Ġcase Ġof Ġ" android " Ġflag Ġsupplied , Ġor Ġto Ġ" idea " Ġotherwise . Ċ Ġ*/ Ċ class ĠImport Ordering Rule Ġ: ĠRule (" import - ordering ") Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġimports Layout : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġimport Sorter : ĠImport Sorter ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAl phabet ical Ġwith Ġcapital Ġletters Ġbefore Ġlower Ġcase Ġletters Ġ( e . g . ĠZ Ġbefore Ġa ). ĊĠĠĠĠĠĠĠĠ Ġ* ĠNo Ġblank Ġlines Ġbetween Ġmajor Ġgroups Ġ( android , Ġcom , Ġjunit , Ġnet , Ġorg , Ġjava , Ġjavax ). ĊĠĠĠĠĠĠĠĠ Ġ* ĠSingle Ġgroup Ġregardless Ġof Ġimport Ġtype . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġhttps :// developer . android . com / kotlin / style - guide # import _ statements ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠASCII _ PATTERN Ġ= Ġ"*" ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDefault ĠIntelliJ ĠIDEA Ġstyle : ĠAl phabet ical Ġwith Ġcapital Ġletters Ġbefore Ġlower Ġcase Ġletters Ġ( e . g . ĠZ Ġbefore Ġa ), ĊĠĠĠĠĠĠĠĠ Ġ* Ġexcept Ġsuch Ġgroups Ġas Ġ" java ", Ġ" javax " Ġand Ġ" kotlin " Ġthat Ġare Ġplaced Ġin Ġthe Ġend . ĠWith in Ġthe Ġgroups Ġthe Ġalphabet ical Ġorder Ġis Ġpreserved . ĊĠĠĠĠĠĠĠĠ Ġ* ĠAlias Ġimports Ġare Ġplaced Ġin Ġa Ġseparate Ġgroup Ġin Ġthe Ġend Ġof Ġthe Ġlist Ġwith Ġalphabet ical Ġorder Ġinside . ĊĠĠĠĠĠĠĠĠ Ġ* ĠNo Ġblank Ġlines Ġbetween Ġgroups . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġhttps :// github . com / Jet Brains / kotlin / blob / ffd ab 4 7 3 e 2 8 d 0 d 8 7 2 1 3 6 b 9 1 0 eb 2 e 0 f 4 be ea 2 e 1 9 c / idea / formatter / src / org / jetbrains / kotlin / idea / core / formatter / Kotlin Code Style Settings . java # L 8 7 - L 9 1 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠIDEA _ PATTERN Ġ= Ġ" *, java .*, javax .*, kotlin .*, ^ *" ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠIDEA _ ERROR _ MESSAGE Ġ= Ġ" Imports Ġmust Ġbe Ġordered Ġin Ġlex ico graphic Ġorder Ġwithout Ġany Ġempty Ġlines Ġin - between Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" with Ġ\" java \", Ġ\" javax \", Ġ\" kotlin \" Ġand Ġaliases Ġin Ġthe Ġend " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠASCII _ ERROR _ MESSAGE Ġ= Ġ" Imports Ġmust Ġbe Ġordered Ġin Ġlex ico graphic Ġorder Ġwithout Ġany Ġempty Ġlines Ġin - between " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCUSTOM _ ERROR _ MESSAGE Ġ= Ġ" Imports Ġmust Ġbe Ġordered Ġaccording Ġto Ġthe Ġpattern Ġspecified Ġin Ġ. editor config " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġerror Messages Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIDEA _ PATTERN Ġto ĠIDEA _ ERROR _ MESSAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠASCII _ PATTERN Ġto ĠASCII _ ERROR _ MESSAGE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġauto Correct : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġemit : Ġ( offset : ĠInt , ĠerrorMessage : ĠString , Ġcan Be Auto Correct ed : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node . is Root ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġandroid Ġ= Ġnode . getUser Data ( Kt Lint . ANDROID _ USER _ DATA _ KEY ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Config Ġ= Ġnode . getUser Data ( Kt Lint . EDITOR _ CONFIG _ USER _ DATA _ KEY ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimports Layout Ġ= Ġeditor Config . resolve Imports Layout ( android ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Sorter Ġ= ĠImport Sorter ( imports Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( node . elementType Ġ== ĠElementType . IMPORT _ LIST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġnode . getChildren ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġchildren . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . elementType Ġ== ĠElementType . IMPORT _ DIRECT IVE Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . psi Ġis ĠPsi WhiteSpace Ġ&& Ġit . text Length Ġ> Ġ 1 Ġ// Ġalso Ġcollect Ġempty Ġlines , Ġthat Ġare Ġrepresented Ġas Ġ"\ n \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Comments Ġ= Ġchildren . find Ġ{ Ġit . elementType Ġ== ĠElementType . BLOCK _ COMMENT Ġ|| Ġit . elementType Ġ== ĠElementType . EOL _ COMMENT Ġ} Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Imports Ġ= Ġimports ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . psi Ġ! is ĠPsi WhiteSpace Ġ} Ġ// Ġsort er Ġexpects ĠK t Import Directive , Ġwh ites p aces Ġare Ġinserted Ġafterwards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . psi Ġas ĠK t Import Directive Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( import Sorter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct By Ġ{ Ġif Ġ( it . alias Name Ġ!= Ġnull ) Ġit . text . substring Before Last ( it . alias Name !! ) Ġelse Ġit . text Ġ} Ġ// Ġdistinguish Ġby Ġimport Ġpath Ġw / o Ġaliases ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . node Ġ} Ġ// Ġtransform Ġback Ġto ĠAST Node Ġin Ġorder Ġto Ġoperate Ġover Ġits Ġmethod Ġ( addChild ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinsert Ġblank Ġlines Ġwhere ver Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtraverse Ġthe Ġlist Ġusing Ġfold Ġto Ġhave Ġprevious Ġand Ġcurrent Ġelement Ġand Ġdecide Ġif Ġthe Ġblank Ġline Ġis Ġneeded Ġin Ġbetween ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbased Ġon Ġthe ĠImport Sorter Ġimported Ġpatterns Ġand Ġindexes Ġfrom Ġthe Ġcomparator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Import sWith Spaces Ġ= Ġmutable ListOf < AST Node >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Imports . fold ( null Ġas ĠAST Node ?) Ġ{ Ġprev , Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex 1 Ġ= Ġif Ġ( prev Ġ== Ġnull ) Ġ- 1 Ġelse Ġimport Sorter . find Import Index (( prev . psi Ġas ĠK t Import Directive ). import Path !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex 2 Ġ= Ġimport Sorter . find Import Index (( current . psi Ġas ĠK t Import Directive ). import Path !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas Blank Lines Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ( index 1 Ġ+ Ġ 1 ) Ġuntil Ġindex 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( import Sorter . patterns [ i ] Ġ== ĠPattern Entry . BLANK _ LINE _ ENTRY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Blank Lines Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Blank Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Import sWith Spaces Ġ+= ĠPsi WhiteSpace Impl ("\ n \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Import sWith Spaces Ġ+= Ġcurrent ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ fold Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan Auto Correct Ġ= Ġ! has Comments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! imports AreEqual ( imports , Ġsorted Import sWith Spaces ) Ġ|| Ġ( has Too M uch Whitespace ( children ) Ġ&& Ġ! is Custom Layout ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Message Ġ= Ġif Ġ(! can Auto Correct ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ-- Ġno Ġautoc orre ction Ġdue Ġto Ġcomments Ġin Ġthe Ġimport Ġlist " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ error Messages . get OrDefault ( imports Layout , ĠCUSTOM _ ERROR _ MESSAGE )} $ additional Message ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Auto Correct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Correct Ġ&& Ġcan Auto Correct ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . remove Range ( node . firstChild Node , Ġnode . last Child Node . tree Next ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Import sWith Spaces . reduce Ġ{ Ġcurrent , Ġnext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . addChild ( current , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ! is ĠPsi WhiteSpace Ġ&& Ġnext Ġ! is ĠPsi WhiteSpace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . addChild ( Psi WhiteSpace Impl ("\ n "), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ reduce Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . addChild ( sorted Import sWith Spaces . last (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠEditor Config . resolve Imports Layout ( android : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Pattern Ġ= Ġif Ġ( android ) Ġ" ascii " Ġelse Ġ" idea " ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! get (" kotlin _ imports _ layout "). isNull OrEmpty () Ġ-> Ġget (" kotlin _ imports _ layout ") !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! get (" ij _ kotlin _ imports _ layout "). isNull OrEmpty () Ġ-> Ġget (" ij _ kotlin _ imports _ layout ") !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdefault Pattern Ġ// Ġdefault Ġto Ġascii Ġ( android ) Ġor Ġidea Ġin Ġcase Ġthere 's Ġno Ġsuch Ġentry Ġin Ġ. editor config ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( layout ) Ġ{ Ġ// Ġtransform Ġpredefined Ġstyles Ġinto Ġpatterns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" idea " Ġ-> ĠIDEA _ PATTERN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ascii " Ġ-> ĠASCII _ PATTERN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlayout ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġimports AreEqual ( actual : ĠList < AST Node >, Ġexpected : ĠList < AST Node >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( actual . size Ġ!= Ġexpected . size ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġcombined Ġ= Ġactual . zip ( expected ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcombined . all Ġ{ Ġ( first , Ġsecond ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġis ĠPsi WhiteSpace Ġ&& Ġsecond Ġis ĠPsi WhiteSpace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ all Ġ( first Ġas ĠPsi WhiteSpace ). text Ġ== Ġ( second Ġas ĠPsi WhiteSpace ). text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ all Ġfirst Ġ== Ġsecond ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Custom Layout () Ġ= Ġimports Layout Ġ!= ĠIDEA _ PATTERN Ġ&& Ġimports Layout Ġ!= ĠASCII _ PATTERN ĊĊĠĠĠ Ġprivate Ġfun Ġhas Too M uch Whitespace ( nodes : ĠArray < AST Node >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnodes . any Ġ{ Ġit Ġis ĠPsi WhiteSpace Ġ&& Ġ( it Ġas ĠPsi WhiteSpace ). text Ġ!= Ġ"\ n " Ġ} ĊĠĠĠ Ġ} Ċ } Ċ