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 . Editor Config . Companion . load Editor Config Ċ import Ġcom . p interest . kt lint . core . Editor Config . Companion . load Indent Config Ċ import Ġcom . p interest . kt lint . core . Indent Config Ċ import Ġcom . p interest . kt lint . core . Indent Config . Indent Style . SPACE Ċ import Ġcom . p interest . kt lint . core . Indent Config . Indent Style . TAB Ċ import Ġcom . p interest . kt lint . core . Rule Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . ARROW Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . BINARY _ EXPRESSION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . BINARY _ WITH _ TYPE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . BLOCK _ COMMENT Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . BODY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . BY _ KEYWORD Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . CALL _ EXPRESSION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . CLO SING _ QUOTE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . COL ON Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . CONDITION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . DE LEG ATED _ SUPER _ TYPE _ ENTRY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . DOT _ QUAL IFI ED _ EXPRESSION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . ELSE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . EL VIS Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . EOL _ COMMENT Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . EQ Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . FUN Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . FUNCTION _ LITERAL Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . GT Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . IDENTIFIER Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . K DOC Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . K DOC _ END Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . K DOC _ LEADING _ ASTER IS K Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . K DOC _ START Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . L BRACE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . L BRACK ET Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . LITERAL _ STRING _ TEMPLATE _ ENTRY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . LONG _ STRING _ TEMPLATE _ ENTRY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . L PAR Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . LT Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . OPEN _ QUOTE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . OPERATION _ REFERENCE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . PAREN TH ES IZED Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . PROPERTY _ ACCESS OR Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . R BRACE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . R BRACK ET Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . REG ULAR _ STRING _ PART Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . R PAR Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . SAFE _ ACCESS _ EXPRESSION Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . SECOND ARY _ CON STRUCTOR Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . SHORT _ STRING _ TEMPLATE _ ENTRY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . STRING _ TEMPLATE Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . SUPER _ TYPE _ CALL _ ENTRY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . SUPER _ TYPE _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . THEN Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . TYPE _ ARGUMENT _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . TYPE _ CONSTRAINT _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . TYPE _ PARAMETER _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . VALUE _ ARGUMENT Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . VALUE _ ARGUMENT _ LIST Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . WHEN _ ENTRY Ċ import Ġcom . p interest . kt lint . core . ast . ElementType . WHERE _ KEYWORD Ċ 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 . is WhiteSpace With New line Ċ import Ġcom . p interest . kt lint . core . ast . is WhiteSpace Without New line Ċ import Ġcom . p interest . kt lint . core . ast . next Code Sibling Ċ import Ġcom . p interest . kt lint . core . ast . next Leaf Ċ 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 Code Leaf Ċ import Ġcom . p interest . kt lint . core . ast . prev Code Sibling Ċ import Ġcom . p interest . kt lint . core . ast . prev Leaf Ċ import Ġcom . p interest . kt lint . core . ast . visit Ċ import Ġcom . p interest . kt lint . core . init Kt Lint K Logger Ċ import Ġcom . p interest . kt lint . rule set . standard . Indent ation Rule . Indent Context . Block Ċ import Ġcom . p interest . kt lint . rule set . standard . Indent ation Rule . Indent Context . Block . Block Indent ation Type . REG ULAR Ċ import Ġcom . p interest . kt lint . rule set . standard . Indent ation Rule . Indent Context . Block . Block Indent ation Type . SAME _ AS _ PREVIOUS _ BLOCK Ċ import Ġjava . util . Deque Ċ import Ġjava . util . LinkedList Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . jetbrains . kotlin . com . intellij . lang . AST Node Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . Psi Comment Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . impl . source . tree . Leaf Psi Element Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . tree . I ElementType Ċ import Ġorg . jetbrains . kotlin . com . intellij . psi . tree . Token Set Ċ import Ġorg . jetbrains . kotlin . psi . Kt String Template Expression Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . leaves Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} . init Kt Lint K Logger () Ċ Ċ /** Ċ Ġ* ĠChecks Ġ& Ġcorrect Ġindentation Ċ Ġ* Ċ Ġ* ĠCurrent Ġlimitations : Ċ Ġ* Ġ- Ġ" all Ġor Ġnothing " Ġ( currently , Ġrule Ġcan Ġonly Ġbe Ġdisabled Ġfor Ġan Ġentire Ġfile ) Ċ Ġ*/ Ċ public Ġclass ĠInd ent ation Rule Ġ: ĠRule ( ĊĠĠĠ Ġid Ġ= Ġ" indent ", ĊĠĠĠ Ġvisitor Modifiers Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ ĠVisitor Modifier . Run On Root Node Only , ĊĠĠĠĠĠĠĠ ĠVisitor Modifier . Run As Late As Possible ĊĠĠĠ Ġ) Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġl Token Set Ġ= ĠToken Set . create ( L PAR , ĠL BRACE , ĠL BRACK ET , ĠLT ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġr Token Set Ġ= ĠToken Set . create ( R PAR , ĠR BRACE , ĠR BRACK ET , ĠGT ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmatching R Token Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl Token Set . types . zip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Token Set . types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġline Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġexpected Indent Ġ= Ġ 0 Ġ// ĠTODO : Ġmerge Ġinto ĠInd ent Context ĊĊĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġline Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġexpected Indent Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġeditor Config Ġ= ĠEditor Config . UN INITIAL IZED ĊĠĠĠ Ġprivate Ġvar Ġindent Config Ġ= ĠInd ent Config . DEFAULT _ IND ENT _ CONFIG ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġauto Correct : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġemit : Ġ( offset : ĠInt , ĠerrorMessage : ĠString , Ġcan Be Auto Correct ed : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġeditor Config Ġ= Ġnode . load Editor Config () ĊĠĠĠĠĠĠĠ Ġindent Config Ġ= Ġeditor Config . load Indent Config () ĊĠĠĠĠĠĠĠ Ġif Ġ( indent Config . disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠ Ġindent ( node , Ġauto Correct , Ġemit ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġexpected Indent Ġshould Ġnever Ġbe Ġnegative . ĠIf Ġso , Ġit Ġis Ġvery Ġlikely Ġthat Ġk tl int Ġcrashes Ġat Ġruntime Ġwhen ĊĠĠĠĠĠĠĠ Ġ// Ġautoc orrect ing Ġis Ġexecuted Ġwhile Ġno Ġerror Ġoccurs Ġwith Ġlint ing Ġonly . ĠSuch Ġerrors Ġoften Ġare Ġnot Ġfound Ġin Ġunit ĊĠĠĠĠĠĠĠ Ġ// Ġtests , Ġas Ġthe Ġexamples Ġare Ġway Ġmore Ġsimple Ġthan Ġreal istic Ġcode . ĊĠĠĠĠĠĠĠ Ġassert ( expected Indent Ġ>= Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠInd ent Context Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġexit Adj Ġ= Ġmutable Map Of < AST Node , ĠInt >() ĊĠĠĠĠĠĠĠ Ġval Ġignored Ġ= Ġmutable Set Of < AST Node >() ĊĠĠĠĠĠĠĠ Ġval Ġblock Stack : ĠDe que < Block > Ġ= ĠLinkedList () ĊĠĠĠĠĠĠĠ Ġvar Ġlocal Adj : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġexit Adj By ( node : ĠAST Node , Ġchange : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Adj . compute ( node ) Ġ{ Ġ_, Ġv Ġ-> Ġ( v Ġ?: Ġ 0 ) Ġ+ Ġchange Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclear Exit Adj ( node : ĠAST Node ): ĠInt ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Adj . remove ( node ) ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠBlock ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠElement Ġtype Ġused Ġfor Ġopening Ġthe Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopening ElementType : ĠI ElementType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLine Ġat Ġwhich Ġthe Ġblock Ġis Ġopened ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType Ġof Ġindentation Ġto Ġbe Ġused Ġfor Ġthe Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Indent ation Type : ĠBlock Indent ation Type ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenum Ġclass ĠBlock Indent ation Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠInd ent Ġthe Ġbody Ġof Ġthe Ġblock Ġone Ġlevel Ġdeeper Ġby Ġincreasing Ġthe Ġexpected Ġindentation Ġlevel Ġwith Ġ 1 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠDec re ase Ġthe Ġexpected Ġindentation Ġlevel Ġjust Ġbefore Ġthe Ġclosing Ġelement Ġof Ġthe Ġblock . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREG ULAR , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠKeep Ġthe Ġindent Ġof Ġthe Ġbody Ġof Ġthe Ġblock Ġidentical Ġto Ġthe Ġindent Ġof Ġthe Ġprevious Ġblock , Ġso Ġdo Ġnot Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġexpected Ġindentation Ġlevel . ĠThe Ġindentation Ġof Ġthe Ġclosing Ġelement Ġhas Ġto Ġbe Ġdecrease d Ġone Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwithout Ġalter ing Ġthe Ġexpected Ġindentation Ġlevel . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS AME _ AS _ PREVIOUS _ BLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġindent ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġauto Correct : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġemit : Ġ( offset : ĠInt , ĠerrorMessage : ĠString , Ġcan Be Auto Correct ed : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst NotEmpty Leaf Ġ= Ġnode . next Leaf () ĊĠĠĠĠĠĠĠ Ġif Ġ( first NotEmpty Leaf ?. let Ġ{ Ġit . elementType Ġ== ĠWH ITE _ SPACE Ġ&& Ġ! it . text Contains ('\ n ') Ġ} Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit WhiteSpace ( first NotEmpty Leaf , Ġauto Correct , Ġemit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠInd ent Context () ĊĠĠĠĠĠĠĠ Ġnode . visit ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( n . elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL PAR , ĠL BRACE , ĠL BRACK ET Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ({ [ Ġshould Ġincrease Ġexpected Indent Ġby Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Block Ġ= Ġctx . block Stack . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn . is Closed On Same Line () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ line : Ġblock Ġstarting Ġwith Ġ${ n . text } Ġis Ġopened Ġand Ġclosed Ġon Ġthe Ġsame Ġline , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġindent Ġis Ġkept Ġunchanged Ġ-> Ġ$ expected Indent " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . block Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock ( n . elementType , Ġline , ĠS AME _ AS _ PREVIOUS _ BLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn . is After Value Parameter On Same Line () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ line : Ġblock Ġstarting Ġwith Ġ${ n . text } Ġstarts Ġon Ġsame Ġline Ġas Ġthe Ġprevious Ġvalue Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" parameter Ġvalue Ġended , Ġexpected Ġindent Ġis Ġkept Ġunchanged Ġ-> Ġ$ expected Indent " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . block Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock ( n . elementType , Ġline , ĠS AME _ AS _ PREVIOUS _ BLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Block Ġ!= Ġnull Ġ&& Ġline Ġ== Ġprev Block . line Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ line : Ġblock Ġstarting Ġwith Ġ${ n . text } Ġstarts Ġon Ġsame Ġline Ġas Ġthe Ġprevious Ġblock , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġindent Ġis Ġkept Ġunchanged Ġ-> Ġ$ expected Indent " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . block Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock ( n . elementType , Ġline , ĠS AME _ AS _ PREVIOUS _ BLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġblock Ġstarting Ġwith Ġ${ n . text } Ġ-> ĠIncrease Ġto Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . block Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock ( n . elementType , Ġline , ĠREG ULAR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . block Stack . iterator (). as Sequence (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġ"\ n \ t ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġ" Stack Ġ( new est Ġfirst ) Ġafter Ġpushing Ġnew Ġelement :\ n \ t " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR PAR , ĠR BRACE , ĠR BRACK ET Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ] }) Ġshould Ġdecrease Ġexpected Indent Ġby Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . block Stack . iterator (). as Sequence (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġ"\ n \ t ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġ" Stack Ġbefore Ġpop ping Ġnewest Ġelement Ġfrom Ġtop Ġof Ġstack :\ n \ t " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġctx . block Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( block . block Indent ation Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS AME _ AS _ PREVIOUS _ BLOCK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġblock Ġclosed Ġwith Ġ${ n . elementType }. ĠBlock Indent ation Type Ġ${ block . block Indent ation Type } Ġ-> Ġkeep Ġindent Ġunchanged Ġat Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREG ULAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġblock Ġclosed Ġwith Ġ${ n . elementType }. Ġ Ġ-> ĠDec re ase Ġindent Ġto Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaired Left Ġ= Ġn . paired Left () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġby Keyword On Same Line Ġ= Ġpaired Left . prev Leaf On Same Line ( BY _ KEYWORD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( by Keyword On Same Line Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġby Keyword On Same Line . prev Leaf ()?. is WhiteSpace With New line () Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn . leaves On Same Line ( forward Ġ= Ġtrue ). all Ġ{ Ġit . is WhiteSpace () Ġ|| Ġit . is Part Of Comment () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ-- on Ġsame Ġline Ġas Ġby Ġkeyword Ġ${ n . text } Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ< T > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . tree Parent . elementType . let Ġ{ Ġit Ġ== ĠTYPE _ PARAMETER _ LIST Ġ|| Ġit Ġ== ĠTYPE _ ARGUMENT _ LIST Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ ${ n . text } Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ< T > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . tree Parent . elementType . let Ġ{ Ġit Ġ== ĠTYPE _ PARAMETER _ LIST Ġ|| Ġit Ġ== ĠTYPE _ ARGUMENT _ LIST Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ-- ${ n . text } Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUP ER _ TYPE _ LIST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass ĠA Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠSUP ER _ TYPE _ LIST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent Inside Super TypeList ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUP ER _ TYPE _ CALL _ ENTRY , ĠDE LEG ATED _ SUPER _ TYPE _ ENTRY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIDEA Ġqu irk : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass ĠA Ġ: ĠB ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġf () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠC ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġf () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstead Ġof Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass ĠA Ġ: ĠB ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġf () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠC ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġf () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent Inside Super Type Call ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING _ TEMPLATE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent String Template ( n , Ġauto Correct , Ġemit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOT _ QUAL IFI ED _ EXPRESSION , ĠSA FE _ ACCESS _ EXPRESSION , ĠBINARY _ EXPRESSION , ĠBINARY _ WITH _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Block Ġ= Ġctx . block Stack . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Block Ġ!= Ġnull Ġ&& Ġprev Block . line Ġ== Ġline ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . ignored . add ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFUNCTION _ LITERAL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent In Function Literal ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWH ITE _ SPACE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . text Contains ('\ n ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! n . is Part Of Comment () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! n . is Part OfType Constraint () Ġ// ĠFIXME ĠInd ent ation Rule Test . test Lint Where Clause Ġnot Ġchecked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġn . tree Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Sibling Ġ= Ġn . tree Next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Leaf Ġ= Ġn . prev Leaf Ġ{ Ġ! it . is Part Of Comment () Ġ&& Ġ! it . is WhiteSpace Without New line () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . elementType . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== ĠDOT _ QUAL IFI ED _ EXPRESSION Ġ|| Ġit Ġ== ĠSA FE _ ACCESS _ EXPRESSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ. x () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ. y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent Inside Qualified Expression ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . elementType . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== ĠBINARY _ EXPRESSION Ġ|| Ġit Ġ== ĠBINARY _ WITH _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ+ Ġx () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ+ Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent Inside Binary Expression ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Sibling ?. elementType . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== ĠTHEN Ġ|| Ġit Ġ== ĠELSE Ġ|| Ġit Ġ== ĠB ODY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ(...) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠELSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhile Ġ(...) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠB ODY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent In Front Of Control Block ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Sibling ?. elementType Ġ== ĠPROPERTY _ ACCESS OR Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġf : ĠType Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠPROPERTY _ ACCESS OR Ġget () Ġ= Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠPROPERTY _ ACCESS OR Ġset () Ġ= Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent In Front Of Property Accessor ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Sibling ?. elementType Ġ== ĠSUP ER _ TYPE _ LIST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass ĠC Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠSUP ER _ TYPE _ LIST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent In Front Of Super TypeList ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Leaf ?. elementType Ġ== ĠE Q Ġ&& Ġp . elementType Ġ!= ĠVALUE _ ARGUMENT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġv Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent After Eq ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Leaf ?. elementType Ġ== ĠAR ROW Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent After Arrow ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Leaf ?. elementType Ġ== ĠCOL ON Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfun Ġfn (): ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent After Colon ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Leaf ?. elementType Ġ== ĠL PAR Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . elementType Ġ== ĠVALUE _ ARGUMENT _ LIST Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . parent ( CONDITION )?. take If Ġ{ Ġ! it . prev Leaf (). is WhiteSpace With New line () Ġ} Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ( condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent After L par Inside Condition ( n , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit WhiteSpace ( n , Ġauto Correct , Ġemit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . local Adj Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent Ġ+= Ġctx . local Adj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ ${ ctx . local Adj } Ġon Ġwhitespace Ġcontaining Ġnew Ġline Ġ(${ n . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . local Adj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( n . is Part Of ( K DOC )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit WhiteSpace ( n , Ġauto Correct , Ġemit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ+= Ġn . text . count Ġ{ Ġit Ġ== Ġ'\ n ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE OL _ COMMENT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . text Ġ== Ġ"// Ġk tl int - debug - print - expected - indent ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġexpected Ġindent : Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( n . elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUP ER _ TYPE _ LIST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Expected Indent After Super TypeList ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOT _ QUAL IFI ED _ EXPRESSION , ĠSA FE _ ACCESS _ EXPRESSION , ĠBINARY _ EXPRESSION , ĠBINARY _ WITH _ TYPE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . ignored . remove ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadj Ġ= Ġctx . clear Exit Adj ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adj Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent Ġ+= Ġadj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġadjusted Ġ${ n . elementType } Ġby Ġ$ adj Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent Inside Qualified Expression ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġn . parent ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . tree Parent . elementType Ġ!= ĠDOT _ QUAL IFI ED _ EXPRESSION Ġ&& Ġit . tree Parent . elementType Ġ!= ĠSA FE _ ACCESS _ EXPRESSION ĊĠĠĠĠĠĠĠ Ġ}) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnext Sibling Ġ= Ġn . tree Next ĊĠĠĠĠĠĠĠ Ġif Ġ(! ctx . ignored . contains ( p ) Ġ&& Ġnext Sibling Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ inside (${ p . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . ignored . add ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( p , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent Inside Binary Expression ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! n . is Part Of Condition ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġn . tree Parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ctx . ignored . contains ( p )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ inside (${ p . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Operand Ġ= Ġn . next Sibling Ġ{ Ġsibling Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsibling . elementType Ġ!= ĠOPER ATION _ REFERENCE Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsibling . elementType Ġ!= ĠWH ITE _ SPACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( r Operand , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Sibling Ġ= Ġn . tree Next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Sibling ?. elementType . let Ġ{ Ġit Ġ== ĠBINARY _ EXPRESSION Ġ|| Ġit Ġ== ĠBINARY _ WITH _ TYPE Ġ} Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Sibling . children (). first OrNull Ġ{ Ġit . elementType Ġ== ĠOPER ATION _ REFERENCE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . firstChild Node ?. elementType Ġ!= ĠEL VIS Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Sibling . firstChild Node . elementType Ġ!= ĠCALL _ EXPRESSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . local Adj Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ-- inside (${ next Sibling . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( p , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent In Front Of Control Block ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Sibling Ġ= Ġn . tree Next ĊĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ in _ front (${ next Sibling . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠ Ġctx . exit Adj By ( next Sibling , Ġ- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent In Front Of Property Accessor ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ in _ front (${ n . tree Next . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠ Ġctx . exit Adj By ( n . tree Next , Ġ- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent In Front Of Super TypeList ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ in _ front (${ n . tree Next . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠ Ġctx . local Adj Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent Inside Super TypeList ( n : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ inside (${ n . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent After Super TypeList ( n : ĠAST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġby Keyword Leaf Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Child ByType ( DE LEG ATED _ SUPER _ TYPE _ ENTRY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find Child ByType ( BY _ KEYWORD ) ĊĠĠĠĠĠĠĠ Ġif Ġ( n . prev Leaf ()?. text Contains ('\ n ') Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġby Keyword Leaf ?. prev Leaf (). is WhiteSpace With New line () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( by Keyword Leaf ?. prev Leaf ()?. text Contains ('\ n ') Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġby Keyword Leaf . prev Leaf ()?. tree Parent ?. next Leaf ()?. elementType Ġ== ĠIDENT IFIER ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpected Indent -- ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ-- after (${ n . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent Inside Super Type Call ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġadjust Ġindent s Ġfor Ġinitializer Ġlists ĊĠĠĠĠĠĠĠ Ġif Ġ( n . tree Parent ?. elementType Ġ!= ĠSUP ER _ TYPE _ LIST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( n . prev Leaf ()?. text Contains ('\ n ') Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ-- inside (${ n . elementType }) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( n , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent After Eq ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ after ( EQ ) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠ Ġctx . exit Adj By ( n . tree Parent , Ġ- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent After Arrow ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġadjust Ġindent s Ġfor Ġarrows Ġinside Ġof Ġwhen Ġstatements . ĠLambda Ġarrows Ġshould Ġnot Ġincrease Ġindent . ĊĠĠĠĠĠĠĠ Ġif Ġ( n . tree Parent ?. elementType Ġ== ĠWHEN _ ENTRY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Block Ġ= Ġctx . block Stack . peek () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Block Ġ== Ġnull Ġ|| Ġline Ġ!= Ġprev Block . line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ after ( ARROW ) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( n . tree Parent , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent After Colon ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn . is Part Of ( FUN ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ after ( COL ON ĠIN ĠFUN ) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġn . next Code Sibling () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( returnType !! , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn . tree Parent . is Part Of ( SECOND ARY _ CON STRUCTOR ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ after ( COL ON ĠIN ĠCON STRUCTOR ) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Code Sibling Ġ= Ġn . next Code Sibling () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( next Code Sibling !! , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ after ( COL ON ) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( n . tree Parent , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent After L par Inside Condition ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ inside ( CONDITION ) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠ Ġctx . exit Adj By ( n . tree Parent , Ġ- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Expected Indent In Function Literal ( n : ĠAST Node , Ġctx : ĠInd ent Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( n . elementType Ġ== ĠFUNCTION _ LITERAL ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcount Non WhiteSpace Elements Before Arrow Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġarrow Node : ĠAST Node ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġhas WhiteSpace With NewLine Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġn . children (). iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . elementType Ġ== ĠAR ROW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarrow Node Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . elementType Ġ== ĠWH ITE _ SPACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas WhiteSpace With NewLine Ġ= Ġhas WhiteSpace With NewLine Ġ|| Ġchild . text . contains ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Non WhiteSpace Elements Before Arrow ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( arrow Node Ġ!= Ġnull Ġ&& Ġhas WhiteSpace With NewLine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ after ( FUNCTION _ LITERAL ) Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . exit Adj By ( arrow Node . prev Code Sibling () !! , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġindent String Template ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġauto Correct : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġemit : Ġ( offset : ĠInt , ĠerrorMessage : ĠString , Ġcan Be Auto Correct ed : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġnode . psi Ġas ĠK t String Template Expression ĊĠĠĠĠĠĠĠ Ġif Ġ( psi . is Multi Line ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . contains Mixed Indent ation Characters ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġcan Ġnot Ġbe Ġdetermined Ġwith Ġcert ainty Ġhow Ġmixed Ġindentation Ġcharacters Ġshould Ġbe Ġinterpreted . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġtrim Indent Ġfunction Ġhandles Ġtabs Ġand Ġspaces Ġequ ally Ġ( one Ġtabs Ġequals Ġone Ġspace ) Ġwhile Ġthe Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmight Ġexpect Ġthat Ġthe Ġtab Ġsize Ġin Ġthe Ġindentation Ġis Ġmore Ġthan Ġone Ġspace . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Indent ation Ġof Ġmultiline Ġstring Ġshould Ġnot Ġcontain Ġboth Ġtab ( s ) Ġand Ġspace ( s )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Length Ġ= Ġnode . children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . elementType Ġ== ĠOPEN _ QUOTE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . elementType Ġ== ĠCLO SING _ QUOTE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . prev Leaf ()?. text Ġ== Ġ"\ n " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . text Ġ== Ġ"\ n " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġindent s Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent s Except Blank Indent Before Closing Quote Ġ= Ġindent s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . is Indent Before Closing Quote () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( indent s Except Blank Indent Before Closing Quote . count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent s Except Blank Indent Before Closing Quote ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . text . indent Length () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min OrNull () Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorrected Expected Indent Ġ= Ġif Ġ( node . prev Leaf ()?. text Ġ== Ġ"\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġthe Ġopening Ġquotes Ġare Ġplaced Ġat Ġthe Ġstart Ġof Ġthe Ġline , Ġthen Ġexpect Ġall Ġlines Ġinside Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstring Ġliteral Ġand Ġthe Ġclosing Ġquotes Ġto Ġhave Ġno Ġindent Ġas Ġwell . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Indent ation Ġ= Ġindent Config . indent . repeat ( corrected Expected Indent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Prefix Length Ġ= Ġcorrected Expected Indent Ġ* Ġindent Config . indent . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . prev Leaf ()?. text Ġ== Ġ"\ n " Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Literal String Template Entry () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Variable String Template Entry () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Closing Quote () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( actual Indent , Ġactual Content ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Indent Before Closing Quote ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . text . split Indent At ( it . text . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . is Variable String Template Entry () Ġ&& Ġit . is First Non Blank Element On Line ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getFirst Element On Same Line (). text . split Indent At ( expected Prefix Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . text . split Indent At ( prefix Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( indent Config . contains Unexpected Indent Char ( actual Indent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset First Wrong Indent Char Ġ= Ġindent Config . indexOf First Unexpected Indent Char ( actual Indent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start Offset Ġ+ Ġoffset First Wrong Indent Char , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġ'${ indent Config . unexpected Indent Char Description }' Ġcharacter ( s ) Ġin Ġmargin Ġof Ġmultiline Ġstring ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Correct ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . firstChild Node Ġas ĠLeaf Psi Element ). raw Replace With Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ation Ġ+ Ġactual Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( actual Indent Ġ!= Ġexpected Indent ation Ġ&& Ġit . is Indent Before Closing Quote ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġa Ġdeli ber ate Ġchoice Ġnot Ġto Ġfix Ġthe Ġindent s Ġinside Ġthe Ġstring Ġliteral Ġexcept Ġthe Ġline Ġwhich Ġonly Ġcontains ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġclosing Ġquotes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġindent Ġof Ġmultiline Ġstring Ġclosing Ġquotes ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Correct ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . firstChild Node Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠLeaf Psi Element ). raw Insert Before Me ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLeaf Psi Element ( REG ULAR _ STRING _ PART , Ġexpected Indent ation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . firstChild Node Ġas ĠLeaf Psi Element ). raw Replace With Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ation Ġ+ Ġactual Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠK t String Template Expression . is Multi Line (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġnode . children ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . elementType Ġ== ĠL ITERAL _ STRING _ TEMPLATE _ ENTRY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġchild . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ== Ġ"\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . indent Length () Ġ= ĊĠĠĠĠĠĠĠ ĠindexOf First Ġ{ Ġ! it . is Whitespace () Ġ}. let Ġ{ Ġif Ġ( it Ġ== Ġ- 1 ) Ġlength Ġelse Ġit Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit WhiteSpace ( ĊĠĠĠĠĠĠĠ Ġnode : ĠAST Node , ĊĠĠĠĠĠĠĠ Ġauto Correct : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġemit : Ġ( offset : ĠInt , ĠerrorMessage : ĠString , Ġcan Be Auto Correct ed : ĠBoolean ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġnode . text ĊĠĠĠĠĠĠĠ Ġval Ġnode Indent Ġ= Ġtext . substring After Last ("\ n ") ĊĠĠĠĠĠĠĠ Ġval Ġnext Leaf Ġ= Ġnode . next Leaf () ĊĠĠĠĠĠĠĠ Ġval Ġnext Leaf ElementType Ġ= Ġnext Leaf ?. elementType ĊĠĠĠĠĠĠĠ Ġif Ġ( next Leaf ElementType Ġ== ĠOPEN _ QUOTE Ġ&& Ġnext Leaf . text Ġ== Ġ"\" \"\ "" Ġ&& Ġnode Indent . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// Ġraw Ġstrings Ġ( """ ") Ġare Ġallowed Ġat Ġcolumn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcomment Ġ= Ġnext Leaf ?. parent ({ Ġit . psi Ġis ĠPsi Comment Ġ}, Ġstrict Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( comment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Indent . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// Ġcomments Ġare Ġallowed Ġat Ġcolumn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comment . text Contains ('\ n ') Ġ&& Ġcomment . elementType Ġ== ĠBLOCK _ COMMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME : Ġwhile Ġwe Ġcannot Ġassume Ġany Ġkind Ġof Ġlayout Ġinside Ġa Ġblock Ġcomment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` /* ` Ġand Ġ` */ ` Ġcan Ġstill Ġbe Ġindent ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġadjust ing Ġexpected Indent Ġbased Ġon Ġwhat Ġis Ġin Ġfront ĊĠĠĠĠĠĠĠ Ġval Ġadjusted Expected Indent Ġ= Ġexpected Indent Ġ+ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIDEA Ġqu irk : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġv Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstead Ġof Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġv Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Leaf ElementType Ġ== ĠR PAR Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tree Parent ?. elementType Ġ== ĠP AREN TH ES IZED Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIDEA Ġqu irk : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass ĠA Ġ: ĠT < ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠK , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstead Ġof Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass ĠA Ġ: ĠT < ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠK , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Leaf ElementType Ġ== ĠCOL ON Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Leaf ElementType Ġ== ĠGT Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tree Parent ?. elementType . let Ġ{ Ġit Ġ== ĠTYPE _ PARAMETER _ LIST Ġ|| Ġit Ġ== ĠTYPE _ ARGUMENT _ LIST Ġ} Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Leaf ElementType Ġin Ġr Token Set Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIDEA Ġqu irk : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġi : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġby Ġlazy Ġ{ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstead Ġof Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġi : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġlazy Ġ{ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Leaf ElementType Ġ== ĠBY _ KEYWORD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . is Part Of ( DE LEG ATED _ SUPER _ TYPE _ ENTRY ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tree Parent . prev Leaf ()?. text Contains ('\ n ') Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( node . is Part Of ( DE LEG ATED _ SUPER _ TYPE _ ENTRY ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . tree Parent . next Leaf ()?. elementType Ġ== ĠIDENT IFIER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Indent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ"$ line : Ġ++ whitespace Ġfollowed Ġby ĠBY Ġkeyword Ġ-> Ġ$ expected Indent " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIDEA Ġqu irk : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvar Ġvalue : ĠData Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠData Class (" too Ġlong Ġline ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġinstead Ġof Ġexpected : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġvar Ġvalue : ĠData Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ ĠData Class (" too Ġlong Ġline ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . next Code Sibling ()?. elementType Ġ== ĠPROPERTY _ ACCESS OR Ġ&& Ġnode . tree Parent . find Child ByType ( EQ )?. next Leaf (). is WhiteSpace With New line () Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġindentation Ġwith Ġincorrect Ġcharacters Ġreplaced ĊĠĠĠĠĠĠĠ Ġval Ġnormalized Node Indent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( indent Config . indent Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSPACE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(' \ t ' Ġin Ġnode Indent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . start Offset Ġ+ Ġtext . length Ġ- Ġnode Indent . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġtab Ġcharacter ( s )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent Config . to Normalized Indent ( node Indent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Indent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAB Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis K doc Indent Ġ= Ġnode . is K Doc Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent Without K doc Indent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . is K Doc Indent ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Indent . remove Suffix (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Indent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(' Ġ' Ġin Ġindent Without K doc Indent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . start Offset Ġ+ Ġtext . length Ġ- Ġnode Indent . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġspace Ġcharacter ( s )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent Config . to Normalized Indent ( indent Without K doc Indent ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe - add Ġthe Ġk doc Ġindent Ġwhen Ġit Ġwas Ġpresent Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is K doc Indent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Indent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected Indent Ġ= Ġindent Config . indent . repeat ( adjusted Expected Indent ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ+ 1 Ġspace Ġbefore Ġ* Ġin Ġ` /** \ n Ġ* \ n Ġ*/ ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comment ?. elementType Ġ== ĠK DOC Ġ&& Ġnext Leaf ElementType Ġ!= ĠK DOC _ START ) Ġ" Ġ" Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( normalized Node Indent Ġ!= Ġexpected Indent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . start Offset Ġ+ Ġtext . length Ġ- Ġnode Indent . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġindentation Ġ(${ normalized Node Indent . length }) Ġ( should Ġbe Ġ${ expected Indent . length })", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ line : Ġ" Ġ+ Ġ( if Ġ(! auto Correct ) Ġ" would Ġhave Ġ" Ġelse Ġ"") Ġ+ Ġ" changed Ġindentation Ġto Ġ${ expected Indent . length } Ġ( from Ġ${ normalized Node Indent . length })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( auto Correct ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Indent Ġ!= Ġnormalized Node Indent Ġ|| Ġnormalized Node Indent Ġ!= Ġexpected Indent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( node Ġas ĠLeaf Psi Element ). raw Replace With Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . substring Before Last ("\ n ") Ġ+ Ġ"\ n " Ġ+ Ġexpected Indent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġe . g . ĊĠĠĠ Ġ// Ġif Ġ( condition ), Ġwhile Ġ( condition ), Ġfor Ġ( condition ), Ġ... ĊĠĠĠ Ġprivate Ġfun ĠAST Node . is Part Of Condition (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ( n . tree Parent ?. elementType . let Ġ{ Ġit Ġ== ĠBINARY _ EXPRESSION Ġ|| Ġit Ġ== ĠBINARY _ WITH _ TYPE Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġn . tree Parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġn . tree Parent ?. elementType Ġ== ĠCONDITION ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġe . g . ĊĠĠĠ Ġ// Ġwhere ĠT 1 Ġ: ĠSub Type ..., ĊĠĠĠ Ġ// ĠĠĠĠĠĠ ĠT 2 Ġ: ĠSub Type ... ĊĠĠĠ Ġprivate Ġfun ĠAST Node . is Part OfType Constraint () Ġ= ĊĠĠĠĠĠĠĠ Ġis Part Of ( TYPE _ CONSTRAINT _ LIST ) Ġ|| Ġnext Leaf ()?. elementType Ġ== ĠWHERE _ KEYWORD ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . paired Left (): ĠAST Node Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Type Ġ= Ġwhen Ġ( elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR PAR Ġ-> ĠL PAR ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR BRACE Ġ-> ĠL BRACE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR BRACK ET Ġ-> ĠL BRACK ET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire NotNull ( left Type ) Ġ{ Ġ" Element Ġtype Ġ'$ left Type ' Ġnot Ġallowed " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpaired Left Ġ= Ġtree Parent . find Child ByType ( left Type ) ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( paired Left ) Ġ{ Ġ" Can Ġnot Ġfind Ġthe Ġ'$ left Type ' Ġelement Ġin Ġsame Ġparent " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpaired Left ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . leaves On Same Line ( forward : ĠBoolean ): ĠSequence < AST Node > Ġ= ĊĠĠĠĠĠĠĠ Ġleaves ( forward Ġ= Ġforward ). take While Ġ{ Ġ! it . is WhiteSpace With New line () Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . prev Leaf On Same Line ( prev Leaf Type : ĠI ElementType ): ĠAST Node ? Ġ= ĊĠĠĠĠĠĠĠ Ġleaves On Same Line ( forward Ġ= Ġfalse ). first OrNull Ġ{ Ġit . elementType Ġ== Ġprev Leaf Type Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . is After Value Parameter On Same Line (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠExpect Ġthe Ġcurrent Ġnode Ġto Ġbe Ġthe Ġstart Ġof Ġa Ġblock ĊĠĠĠĠĠĠĠ Ġrequire ( elementType Ġ== ĠL PAR Ġ|| Ġelement Type Ġ== ĠL BRACE Ġ|| Ġelement Type Ġ== ĠL BRACK ET ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġblock Ġis Ġthe Ġfirst Ġcode Ġelement Ġof Ġa Ġvalue Ġparameter ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. prev Code Leaf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . next Code Sibling () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . elementType Ġ== ĠVALUE _ ARGUMENT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġvalue Argument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Argument Ġ== Ġvalue Argument . tree Parent . find Child ByType ( VALUE _ ARGUMENT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġfirst Ġvalue Ġargument Ġin Ġthe Ġlist , Ġso Ġby Ġdefinition Ġit Ġis Ġnot Ġ* after * Ġanother Ġvalue Ġargument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. leaves ( forward Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġit . is WhiteSpace Without New line () Ġ|| Ġit . elementType Ġ!= ĠVALUE _ ARGUMENT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is WhiteSpace Without New line () Ġ|| Ġit . elementType Ġ== ĠVALUE _ ARGUMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġnewline Ġhas Ġbeen Ġfound Ġbetween Ġthe Ġcurrent Ġvalue Ġargument Ġand Ġthe Ġprevious Ġvalue Ġargument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . contains Mixed Indent ation Characters (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġassert (( this . psi Ġas ĠK t String Template Expression ). is Multi Line ()) ĊĠĠĠĠĠĠĠ Ġval Ġnon Blank Lines Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . startsWith ("\" \" \" ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . endsWith ("\" \" \" ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . isBlank () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprefix Length Ġ= Ġnon Blank Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . indent Length () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. min OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġdistinct Indent Characters Ġ= Ġnon Blank Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . split Indent At ( prefix Length ). first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toCharArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. count () ĊĠĠĠĠĠĠĠ Ġreturn Ġdistinct Indent Characters Ġ> Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAST Node . is Closed On Same Line (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclosing ElementType Ġ= Ġmatching R Token [ elementType ] ĊĠĠĠĠĠĠĠ Ġvar Ġcur : ĠAST Node ? Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cur Ġ!= Ġnull Ġ&& Ġcur Ġ!= Ġclosing ElementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur . text . contains ("\ n ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġcur . next Sibling Ġ{ Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAST Node . is K Doc Indent () Ġ= ĊĠĠĠ Ġif Ġ( text . last OrNull () Ġ== Ġ' Ġ') Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġindentation Ġof Ġa ĠK Doc Ġcomment Ġcontains Ġa Ġspace Ġas Ġthe Ġlast Ġcharacter Ġregardless Ġof Ġthe Ġindentation Ġstyle ĊĠĠĠĠĠĠĠ Ġ// Ġ( tabs Ġor Ġspaces ) Ġexcept Ġfor Ġthe Ġstarting Ġline Ġof Ġthe ĠK Doc Ġcomment ĊĠĠĠĠĠĠĠ Ġnext Leaf ()?. elementType Ġ== ĠK DOC _ LEADING _ ASTER IS K Ġ|| Ġnext Leaf ()?. elementType Ġ== ĠK DOC _ END ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠAST Node . is Indent Before Closing Quote () Ġ= ĊĠĠĠ Ġelement Type Ġ== ĠCLO SING _ QUOTE Ġ|| Ġ( text . isBlank () Ġ&& Ġnext Code Sibling ()?. elementType Ġ== ĠCLO SING _ QUOTE ) Ċ Ċ private Ġfun ĠAST Node . is Literal String Template Entry () Ġ= ĊĠĠĠ Ġelement Type Ġ== ĠL ITERAL _ STRING _ TEMPLATE _ ENTRY Ġ&& Ġtext Ġ!= Ġ"\ n " Ċ Ċ private Ġfun ĠAST Node . is Variable String Template Entry () Ġ= ĊĠĠĠ Ġelement Type Ġ== ĠLONG _ STRING _ TEMPLATE _ ENTRY Ġ|| Ġelement Type Ġ== ĠSH ORT _ STRING _ TEMPLATE _ ENTRY Ċ Ċ private Ġfun ĠAST Node . is Closing Quote () Ġ= ĊĠĠĠ Ġelement Type Ġ== ĠCLO SING _ QUOTE Ċ Ċ private Ġfun ĠAST Node . is First Non Blank Element On Line (): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġnode : ĠAST Node ? Ġ= Ġget First Element On Same Line () ĊĠĠĠ Ġwhile Ġ( node Ġ!= Ġnull Ġ&& Ġnode Ġ!= Ġthis Ġ&& Ġnode . text . is Whitespace ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode . next Leaf () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnode Ġ!= Ġthis Ċ } Ċ Ċ private Ġfun ĠString . is Whitespace () Ġ= ĊĠĠĠ Ġnone Ġ{ Ġ! it . is Whitespace () Ġ} Ċ Ċ private Ġfun ĠAST Node . getFirst Element On Same Line (): ĠAST Node Ġ{ ĊĠĠĠ Ġval Ġfirst Leaf On Line Ġ= Ġprev Leaf Ġ{ Ġit . text Ġ== Ġ"\ n " Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( first Leaf On Line Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfirst Leaf On Line . next Leaf ( include Empty Ġ= Ġtrue ) Ġ?: Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSpl its Ġthe Ġstring Ġat Ġthe Ġgiven Ġindex Ġor Ġat Ġthe Ġfirst Ġnon Ġwhite Ġspace Ġcharacter Ġbefore Ġthat Ġindex . ĠThe Ġreturned Ġpair Ċ Ġ* Ġconsists Ġof Ġthe Ġindentation Ġand Ġthe Ġsecond Ġpart Ġcontains Ġthe Ġremainder . ĠNote Ġthat Ġthe Ġsecond Ġpart Ġstill Ġcan Ġstart Ċ Ġ* Ġwith Ġwhitespace Ġcharacters Ġin Ġcase Ġthe Ġoriginal Ġstrings Ġstarts Ġwith Ġmore Ġwhite Ġspace Ġcharacters Ġthan Ġthe Ġrequested Ċ Ġ* Ġsplit Ġindex . Ċ Ġ*/ Ċ private Ġfun ĠString . split Indent At ( index : ĠInt ): ĠPair < String , ĠString > Ġ{ ĊĠĠĠ Ġassert ( index Ġ>= Ġ 0 ) ĊĠĠĠ Ġval Ġfirst Non Whitespace Index Ġ= ĠindexOf First Ġ{ Ġ! it . is Whitespace () Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . length ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsafe Index Ġ= Ġkotlin . math . min ( first Non Whitespace Index , Ġindex ) ĊĠĠĠ Ġreturn ĠPair ( ĊĠĠĠĠĠĠĠ Ġfirst Ġ= Ġthis . take ( safe Index ), ĊĠĠĠĠĠĠĠ Ġsecond Ġ= Ġthis . substring ( safe Index ) ĊĠĠĠ Ġ) Ċ } Ċ