package Ġcom . p interest . kt lint . core Ċ Ċ 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 Ġorg . ec 4 j . core . model . PropertyType Ċ Ċ public Ġdata Ġclass ĠInd ent Config ( ĊĠĠĠ Ġval Ġindent Style : ĠInd ent Style , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġspaces Ġthat Ġis Ġequivalent Ġto Ġone Ġtab ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtab Width : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġuse Ġthe Ġ[ Indent Config ] Ġin Ġa Ġrule , Ġthe Ġfollowing Ġneeds Ġto Ġbe Ġdone : ĊĠĠĠĠ Ġ* Ġ 1 . ĠImplement Ġinterface Ġ[ Uses Editor Config Properties ] Ġon Ġthe Ġrule ĊĠĠĠĠ Ġ* Ġ 2 . ĠRegister Ġthe Ġused Ġor Ġproperties ĊĠĠĠĠ Ġ* ĠĠĠ Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠ Ġoverride Ġval Ġeditor Config Properties : ĠList < Uses Editor Config Properties . Editor Config Property <* >> Ġ= ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ ĠlistOf ( indent Size Property , Ġindent Style Property ) ĊĠĠĠĠ Ġ* ĠĠĠ Ġ``` ĊĠĠĠĠ Ġ* Ġ 3 . ĠInitialize Ġthe ĠInd ent Config ĊĠĠĠĠ Ġ* ĠĠĠ Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠ Ġindent Config Ġ= ĠInd ent Config ( ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġindent Style Ġ= Ġnode . get Editor Config Value ( indent Style Property ), ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġtab Width Ġ= Ġnode . get Editor Config Value ( indent Size Property ) ĊĠĠĠĠ Ġ* ĠĠĠ Ġ) ĊĠĠĠĠ Ġ* ĠĠĠ Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġindent Style : ĠProperty Type . Indent Style Value , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġspaces Ġthat Ġis Ġequivalent Ġto Ġone Ġtab ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġtab Width : ĠInt ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġindent Style Ġ= Ġwhen Ġ( indent Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Type . Indent Style Value . tab Ġ-> ĠTAB ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Type . Indent Style Value . space Ġ-> ĠSPACE ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġtab Width Ġ= Ġtab Width ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġpublic Ġenum Ġclass ĠInd ent Style Ġ{ ĠSPACE , ĠTAB Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġindent Char Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( indent Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAB Ġ-> Ġ'\ t ' ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSPACE Ġ-> Ġ' Ġ' ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġunexpected Indent Char Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( indent Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAB Ġ-> Ġ' Ġ' ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSPACE Ġ-> Ġ'\ t ' ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġdisabled , Ġrules Ġmay Ġnot Ġenforce Ġany Ġindentation Ġrelated Ġchanges Ġregardless Ġof Ġother Ġsettings Ġin Ġthis ĊĠĠĠĠ Ġ* Ġconfiguration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġdisabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtab Width Ġ<= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNormal ized Ġindent Ġof Ġ 1 Ġlevel Ġdeep . ĠRepresentation Ġis Ġeither Ġin Ġspaces Ġor Ġa Ġsingle Ġtab Ġdepending Ġon Ġthe ĊĠĠĠĠ Ġ* Ġconfiguration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġindent : ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( indent Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAB Ġ-> Ġindent Char . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSPACE Ġ-> Ġindent Char . toString (). repeat ( tab Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġ[ text ] Ġto Ġa Ġnormalized Ġindent . ĠIf Ġ[ text ] Ġcontains Ġa Ġnew Ġline , Ġthen Ġonly Ġtext Ġafter Ġthe Ġlast Ġnew Ġline ĊĠĠĠĠ Ġ* Ġis Ġconverted . ĠThis Ġtext Ġmay Ġonly Ġcontain Ġspaces Ġand Ġtabs . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTabs Ġin Ġthe Ġgiven Ġtext Ġare Ġconverted Ġto Ġspaces Ġdepending Ġon Ġthe Ġtab Ġsize Ġof Ġthe Ġindent Ġstyle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġconverting Ġa Ġtext Ġ( possibly Ġcontains Ġboth Ġtabs Ġand Ġspaces ) Ġto Ġtabs , Ġall Ġtabs Ġare Ġfirst Ġconverted Ġto ĊĠĠĠĠ Ġ* Ġspaces . ĠEach Ġconsecutive Ġset Ġof Ġspaces Ġis Ġconverted Ġto Ġtabs . ĠS ap ces Ġwhich Ġare Ġleft , Ġe . g . Ġnot Ġenough Ġspace Ġto ĊĠĠĠĠ Ġ* Ġcomplete Ġa Ġfull Ġtab , Ġare Ġignored Ġsilently . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġto Normalized Indent ( text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindent Ġ= ĠgetText After Last NewLine ( text ) ĊĠĠĠĠĠĠĠ Ġrequire ( indent . matches ( TAB S _ AND _ SP ACES )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( indent Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSPACE Ġ-> Ġindent . replace Tab With Spaces () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAB Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t ". repeat ( indent Level From ( indent )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSil ently Ġsw allow Ġspaces Ġif Ġnot Ġenough Ġspaces Ġpresent Ġto Ġconvert Ġto Ġa Ġtab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġspace Count Ġ= Ġas Spaces . length Ġ- Ġ( tab Count Ġ* Ġtab Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ"\ t ". repeat ( tab Count ) Ġ+ Ġ" Ġ". repeat ( space Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetText After Last NewLine ( text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġtext . indexOf Last Ġ{ Ġit Ġ== Ġ'\ n ' Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġindent Ġ= Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . substring ( index Ġ+ Ġ 1 , Ġtext . length ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġindent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . replace Tab With Spaces () Ġ= Ġreplace ("\ t ", Ġ" Ġ". repeat ( tab Width )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġindent Ġlevel Ġfor Ġgiven Ġ[ text ]. ĠIf Ġ[ text ] Ġcontains Ġa Ġnew Ġline , Ġthen Ġonly Ġtext Ġafter Ġthe Ġlast Ġnew Ġline ĊĠĠĠĠ Ġ* Ġis Ġconsidered . ĠThis Ġtext Ġmay Ġonly Ġcontain Ġspaces Ġand Ġtabs . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTabs Ġin Ġthe Ġ[ text ] Ġare Ġfirst Ġconverted Ġto Ġspaces Ġdepending Ġon Ġthe Ġtab Ġsize Ġof Ġthe Ġindent Ġstyle . ĠFor Ġeach Ġset ĊĠĠĠĠ Ġ* Ġof Ġspaces Ġthat Ġis Ġequivalent Ġto Ġone Ġtab Ġis Ġcounted Ġas Ġindentation Ġlevel . ĠSpace Ġthat Ġare Ġremaining Ġbecause ĊĠĠĠĠ Ġ* Ġthey Ġdo Ġnot Ġfill Ġup Ġan Ġentire Ġtab , Ġare Ġignored Ġsilently . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġindent Level From ( text : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindent Ġ= ĠgetText After Last NewLine ( text ) ĊĠĠĠĠĠĠĠ Ġrequire ( indent . matches ( TAB S _ AND _ SP ACES )) ĊĠĠĠĠĠĠĠ Ġreturn Ġindent . replace Tab With Spaces (). length Ġ/ Ġtab Width ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġcontains Unexpected Indent Char ( indent Text : ĠString ): ĠBoolean Ġ= Ġindent Text . contains ( unexpected Indent Char ) ĊĊĠĠĠ Ġpublic Ġfun ĠindexOf First Unexpected Indent Char ( indent Text : ĠString ): ĠInt Ġ= Ġindent Text . indexOf First Ġ{ Ġit Ġ== Ġunexpected Indent Char Ġ} ĊĊĠĠĠ Ġpublic Ġval Ġunexpected Indent Char Description : ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( indent Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSPACE Ġ-> Ġ" tab " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAB Ġ-> Ġ" space " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAB S _ AND _ SP ACES Ġ= ĠRegex ("[ Ġ\ t ]* ") ĊĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠDEFAULT _ IND ENT _ CONFIG : ĠInd ent Config Ġ= ĠInd ent Config ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent Style Ġ= ĠSPACE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Width Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ