package Ġcom . p interest . rule set . test Ċ Ċ 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 . core . ast . last Child Leaf Or Self Ċ import Ġcom . p interest . kt lint . core . ast . line Number Ċ import Ġcom . p interest . rule set . test . internal . Color Ċ import Ġcom . p interest . rule set . test . internal . color Ċ import Ġjava . io . Print Stream Ċ import Ġorg . jetbrains . kotlin . com . intellij . lang . AST Node Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . tree . I ElementType Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ Ċ public Ġclass ĠDump A STR ule Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġout : ĠPrint Stream Ġ= ĠSystem . err , ĊĠĠĠ Ġprivate Ġval Ġcolor : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠRule (" dump ") Ġ{ ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Type Set Ġ= ĠElementType :: class . members . map Ġ{ Ġit . name Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar ĠlineNumber Column Length : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlast Node : ĠAST Node ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġauto Correct : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġemit : Ġ( offset : ĠInt , ĠerrorMessage : ĠString , Ġcorrected : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node . is Root ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlineNumber Column Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( node . last Child Leaf Or Self (). line Number () Ġ?: Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġvar Ġv Ġ= Ġit ; Ġvar Ġc Ġ= Ġ 0 ; Ġwhile Ġ( v Ġ> Ġ 0 ) Ġ{ Ġc ++; Ġv Ġ/= Ġ 1 0 Ġ}; Ġc Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Node Ġ= Ġnode . last Child Leaf Or Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġlevel Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġparent : ĠAST Node ? Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent ?. tree Parent ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( parent Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġout . println ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . line Number () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠString . format ("% ${ line Number Column Length } s : Ġ", Ġit ). dim () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġonly Ġhappen Ġwhen Ġauto Correct = true Ġand Ġother Ġrules Ġmutate ĠAST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġa Ġway Ġthat Ġchanges Ġtext Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠString . format ("% ${ line Number Column Length } s : Ġ", Ġ"? "). dim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġ". repeat ( level ). dim () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ClassName ( node . psi . className ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ( ". dim () Ġ+ Ġcolor ClassName ( elementType ClassName ( node . elementType )) Ġ+ Ġ") ". dim () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . getChildren ( null ). isEmpty ()) Ġ" Ġ\"" Ġ+ Ġnode . text . escape (). bright en () Ġ+ Ġ"\"" Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Node Ġ== Ġnode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . println () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ". repeat ( line Number Column Length ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġformat : Ġ< line _ number : > Ġ< node . psi :: class > Ġ(< node . elementType >) Ġ\" < node . text >\ "" . dim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ". repeat ( line Number Column Length ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġlegend : Ġ~ Ġ= Ġorg . jetbrains . kotlin , Ġc . i . p Ġ= Ġcom . intellij . psi ". dim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . println () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġelement Type ClassName ( elementType : ĠI ElementType ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġelement Type . toString (). substring After Last (". "). toUpperCase () ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġ" FLOAT _ CONSTANT " Ġ&& Ġelement Type Ġ== ĠK t Tokens . FLOAT _ LITERAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġresolve ĠK t Node Types . FLOAT _ CONSTANT Ġvs ĠK t Tokens . FLOAT _ LITERAL ( FLOAT _ CONSTANT ) Ġconflict ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" FLOAT _ LITERAL " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Kt Tokens . KEYWORD S . contains ( elementType ) Ġ|| ĠK t Tokens . SOFT _ KEYWORD S . contains ( elementType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ"${ name }_ KEYWORD " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( elementType Set . contains ( name )) Ġname Ġelse Ġelement Type . className Ġ+ Ġ"." Ġ+ Ġelement Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcolor ClassName ( className : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠclassName . substring After Last (".") ĊĠĠĠĠĠĠĠ Ġreturn ĠclassName . substring ( 0 , ĠclassName . length Ġ- Ġname . length ). dim () Ġ+ Ġname ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . bright en () Ġ= Ġopt Color ( Color . YELLOW ) ĊĠĠĠ Ġprivate Ġfun ĠString . dim () Ġ= Ġopt Color ( Color . DARK _ GRAY ) ĊĠĠĠ Ġprivate Ġfun ĠString . opt Color ( foreground : ĠColor ) Ġ= Ġif Ġ( color ) Ġthis . color ( foreground ) Ġelse Ġthis ĊĊĠĠĠ Ġprivate Ġval ĠAny . className ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . java Class . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" org . jetbrains . kotlin .", Ġ"~ .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" com . intellij . psi .", Ġ" c . i . p .") ĊĊĠĠĠ Ġprivate Ġfun ĠString . escape () Ġ= ĊĠĠĠĠĠĠĠ Ġthis . replace ("\\ ", Ġ"\\ \ \" ). replace ("\ n ", Ġ"\\ n "). replace ("\ t ", Ġ"\\ t "). replace ("\ r ", Ġ"\\ r ") Ċ } Ċ