package Ġcom . p interest . kt lint . internal Ċ Ċ import Ġcom . p interest . kt lint . core . Kt Lint Ċ import Ġcom . p interest . kt lint . core . Lint Error Ċ import Ġcom . p interest . kt lint . core . Rule Set Ċ import Ġcom . p interest . kt lint . core . api . Feature In Alpha State Ċ import Ġcom . p interest . kt lint . core . init Kt Lint K Logger Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . FileSystem Ċ import Ġjava . nio . file . File Visit Result Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Invalid Path Exception Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . nio . file . Simple File Visitor Ċ import Ġjava . nio . file . attribute . Basic File Attributes Ċ import Ġkotlin . system . exit Process Ċ import Ġmu . Kotlin Logging Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} . init Kt Lint K Logger () Ċ Ċ internal Ġval Ġwork Dir : ĠString Ġ= ĠFile (". "). canonical Path Ċ private Ġval Ġtil de Regex Ġ= ĠRegex ("^ (! )? ~ ") Ċ Ċ internal Ġfun ĠFileSystem . file Sequence ( ĊĠĠĠ Ġglob s : ĠList < String >, ĊĠĠĠ Ġroot Dir : ĠPath Ġ= ĠPaths . get (". "). to AbsolutePath (). normalize () Ċ ): ĠSequence < Path > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Path >() ĊĊĠĠĠ Ġval Ġ( existing Files , Ġactual Glob s ) Ġ= Ġglob s . partition Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . is Regular File ( rootDir . resolve ( it )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid Path Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWindows Ġthrows Ġan Ġexception Ġwhen Ġyou Ġpass Ġa Ġglob Ġto ĠPath # resolve . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġexisting Files . map To ( result ) Ġ{ Ġroot Dir . resolve ( it ) Ġ} ĊĊĠĠĠ Ġ// ĠReturn Ġearly Ġand Ġdon 't Ġtraverse Ġthe Ġfile Ġsystem Ġif Ġall Ġthe Ġinput Ġglob s Ġare Ġabsolute Ġpaths ĊĠĠĠ Ġif Ġ( result . isNotEmpty () Ġ&& Ġactual Glob s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . as Sequence () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpath Matchers Ġ= Ġif Ġ( actual Glob s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetPath Matcher (" glob :** $ glob Separator *. kt "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetPath Matcher (" glob :** $ glob Separator *. k ts ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġactual Glob s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . startsWith (" !") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetPath Matcher ( to Glob ( it , Ġroot Dir )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġneg ated Path Matchers Ġ= Ġif Ġ( actual Glob s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġempty Set () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġactual Glob s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith (" !") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetPath Matcher ( to Glob ( it . remove Prefix (" ! "), Ġroot Dir )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠFiles . walk File Tree ( ĊĠĠĠĠĠĠĠ Ġroot Dir , ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠSimple File Visitor < Path >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath : ĠPath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Attrs : ĠBasic File Attributes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( neg ated Path Matchers . none Ġ{ Ġit . matches ( filePath ) Ġ} Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Matchers . any Ġ{ Ġit . matches ( filePath ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpre Visit Directory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir Path : ĠPath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir Attr : ĠBasic File Attributes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Files . is Hidden ( dir Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Visit Result . SKIP _ SUB TREE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġresult . as Sequence () Ċ } Ċ Ċ private Ġfun ĠFileSystem . is Glob AbsolutePath ( glob : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġroot Dirs Ġ= Ġroot Directories . map Ġ{ Ġit . toString () Ġ} ĊĠĠĠ Ġreturn Ġroot Dirs . any Ġ{ Ġglob . remove Prefix (" ! "). startsWith ( it ) Ġ} Ċ } Ċ Ċ internal Ġfun ĠFileSystem . to Glob ( ĊĠĠĠ Ġpattern : ĠString , ĊĠĠĠ Ġroot Dir : ĠPath Ċ ): ĠString Ġ{ ĊĠĠĠ Ġval Ġos Ġ= ĠSystem . getProperty (" os . name ") ĊĠĠĠ Ġval Ġexpanded Path Ġ= Ġif Ġ( os . startsWith (" windows ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWindows Ġsometimes Ġinserts Ġ` ~ ` Ġinto Ġpaths Ġwhen Ġusing Ġshort Ġdirectory Ġnames Ġnotation , Ġe . g . Ġ` C :\ Users \ USER NA ~ 1 \ Documents ĊĠĠĠĠĠĠĠ Ġpattern ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġexpand T ilde ( pattern ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfull Path Ġ= Ġif Ġ( is Glob AbsolutePath ( expanded Path )) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpanded Path ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot DirPath Ġ= Ġroot Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to AbsolutePath () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormalized Path Ġ= Ġif Ġ(! endsWith ( File . separator )) Ġ"$ this ${ File . separator }" Ġelse Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ"$ root DirPath $ expanded Path " ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. replace ( File . separator , Ġglob Separator ) ĊĠĠĠ Ġreturn Ġ" glob :$ fullPath " Ċ } Ċ Ċ private Ġval Ġglob Separator : ĠString Ġget () Ġ{ ĊĠĠĠ Ġval Ġos Ġ= ĠSystem . getProperty (" os . name ") ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġos . startsWith (" windows ", Ġignore Case Ġ= Ġtrue ) Ġ-> Ġ"\\ \ \" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"/" ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠList Ġof Ġpaths Ġto ĠJava Ġ` jar ` Ġfiles . Ċ Ġ*/ Ċ internal Ġtype alias ĠJar Files Ġ= ĠList < String > Ċ Ċ internal Ġfun ĠJar Files . to Files URI List () Ġ= Ġmap Ġ{ ĊĠĠĠ Ġval Ġjar File Ġ= ĠFile ( expand T ilde ( it )) ĊĠĠĠ Ġif Ġ(! jar File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" File Ġ$ it Ġdoes Ġnot Ġexist " Ġ} ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġjar File . to URI (). to URL () Ċ } Ċ Ċ // Ġa Ġcomplete Ġsolution Ġwould Ġbe Ġto Ġimplement Ġhttps :// www . gnu . org / software / bash / manual / html _ node / T ilde - Expansion . html Ċ // Ġthis Ġimplementation Ġtakes Ġcare Ġonly Ġof Ġthe Ġmost Ġcommonly Ġused Ġcase Ġ(~ /) Ċ private Ġfun Ġexpand T ilde ( path : ĠString ): ĠString Ġ= Ġpath . replace First ( tilde Regex , ĠSystem . getProperty (" user . home ")) Ċ Ċ internal Ġfun ĠFile . location ( ĊĠĠĠ Ġrelative : ĠBoolean Ċ ) Ġ= Ġif Ġ( relative ) Ġthis . to Relative String ( File ( work Dir )) Ġelse Ġthis . path Ċ Ċ /** Ċ Ġ* ĠRun Ġlint Ġover Ġcommon Ġkotlin Ġfile Ġor Ġkotlin Ġscript Ġfile . Ċ Ġ*/ Ċ @ Opt In ( Feature In Alpha State :: class ) Ċ internal Ġfun Ġlint File ( ĊĠĠĠ ĠfileName : ĠString , ĊĠĠĠ Ġfile Contents : ĠString , ĊĠĠĠ Ġrule Sets : ĠIterable < Rule Set >, ĊĠĠĠ ĠuserData : ĠMap < String , ĠString > Ġ= Ġempty Map (), ĊĠĠĠ Ġeditor ConfigPath : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġdebug : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġlint Error Callback : Ġ( Lint Error ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ= ĠK t Lint . lint ( ĊĠĠĠ ĠK t Lint . Experimental Params ( ĊĠĠĠĠĠĠĠ ĠfileName Ġ= ĠfileName , ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġfile Contents , ĊĠĠĠĠĠĠĠ Ġrule Sets Ġ= Ġrule Sets , ĊĠĠĠĠĠĠĠ ĠuserData Ġ= ĠuserData , ĊĠĠĠĠĠĠĠ Ġscript Ġ= Ġ! fileName . endsWith (". kt ", Ġignore Case Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠ Ġeditor ConfigPath Ġ= Ġeditor ConfigPath , ĊĠĠĠĠĠĠĠ Ġcb Ġ= Ġ{ Ġe , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlint Error Callback ( e ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġdebug Ġ= Ġdebug , ĊĠĠĠĠĠĠĠ Ġis Inv oked From Cli Ġ= Ġtrue ĊĠĠĠ Ġ) Ċ ) Ċ Ċ /** Ċ Ġ* ĠFormat Ġa Ġkotlin Ġfile Ġor Ġscript Ġfile Ċ Ġ*/ Ċ @ Opt In ( Feature In Alpha State :: class ) Ċ internal Ġfun Ġformat File ( ĊĠĠĠ ĠfileName : ĠString , ĊĠĠĠ Ġfile Contents : ĠString , ĊĠĠĠ Ġrule Sets : ĠIterable < Rule Set >, ĊĠĠĠ ĠuserData : ĠMap < String , ĠString >, ĊĠĠĠ Ġeditor ConfigPath : ĠString ?, ĊĠĠĠ Ġdebug : ĠBoolean , ĊĠĠĠ Ġcb : Ġ( e : ĠL int Error , Ġcorrected : ĠBoolean ) Ġ-> ĠUnit Ċ ): ĠString Ġ= ĊĠĠĠ ĠK t Lint . format ( ĊĠĠĠĠĠĠĠ ĠK t Lint . Experimental Params ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ= ĠfileName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġfile Contents , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule Sets Ġ= Ġrule Sets , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserData Ġ= ĠuserData , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ġ= Ġ! fileName . endsWith (". kt ", Ġignore Case Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor ConfigPath Ġ= Ġeditor ConfigPath , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcb Ġ= Ġcb , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ= Ġdebug , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Inv oked From Cli Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ