// ĠCopyright Ġ 2 0 0 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . editor config . core Ċ Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . psi . util . Cached Value Ċ import Ġcom . intellij . psi . util . Cached Value Provider Ċ import Ġcom . intellij . psi . util . Cached Values Manager Ċ import Ġdk . br ics . autom aton . Automaton Ċ import Ġdk . br ics . autom aton . RegExp Ċ import Ġdk . br ics . autom aton . Run Automaton Ċ import Ġorg . editor config . language . psi . Editor Config Header Ċ import Ġorg . editor config . language . psi . Editor Config Pattern Ċ import Ġorg . editor config . language . util . Editor Config Presentation Util Ċ import Ġjava . io . File Ċ Ċ object ĠEditor Config Automaton Builder Ġ{ ĊĠ Ġprivate Ġval ĠKEY _ EDITOR CONFIG _ ELEMENT _ RUN _ AUT OM AT ON Ġ= ĠKey < Cached Value < Run Automaton >> (" KEY _ EDITOR CONFIG _ ELEMENT _ RUN _ AUT OM AT ON ") ĊĠ Ġprivate Ġval ĠKEY _ EDITOR CONFIG _ ELEMENT _ AUT OM AT ON Ġ= ĠKey < Cached Value < Automaton >> (" KEY _ EDITOR CONFIG _ ELEMENT _ AUT OM AT ON ") ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ header ] Ġis Ġis Ġassumed Ġto Ġbe Ġvalid ĊĠĠ Ġ* Ġ( i . e . Ġheader . isValid Glob ) ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Cached Header Run Automaton ( header : ĠEditor Config Header ): ĠRun Automaton Ġ= ĊĠĠĠ ĠCached Values Manager . get Cached Value ( header , ĠKEY _ EDITOR CONFIG _ ELEMENT _ RUN _ AUT OM AT ON ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrun Automaton Ġ= ĠRun Automaton ( get Cached Header Automaton ( header )) ĊĠĠĠĠĠ ĠCached Value Provider . Result . create ( run Automaton , Ġheader ) ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ header ] Ġis Ġis Ġassumed Ġto Ġbe Ġvalid ĊĠĠ Ġ* Ġ( i . e . Ġheader . isValid Glob ) ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Cached Header Automaton ( header : ĠEditor Config Header ): ĠAutom aton Ġ= ĊĠĠĠ ĠCached Values Manager . get Cached Value ( header , ĠKEY _ EDITOR CONFIG _ ELEMENT _ AUT OM AT ON ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtext Ġ= Ġheader . text ĊĠĠĠĠĠ ĠLog . assertTrue ( header . isValid Glob , Ġ" builder Ġwas Ġgiven Ġinvalid Ġheader : Ġ${ header . text }") ĊĠĠĠĠĠ ĠLog . assertTrue ( text . length Ġ>= Ġ 3 , Ġ" builder Ġwas Ġgiven Ġa Ġheader Ġof Ġins ufficient Ġlength : Ġ${ header . text }") ĊĠĠĠĠĠ Ġval Ġinternal Text Ġ= Ġtext . substring ( 1 , Ġtext . length Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġval Ġpath Ġ= ĠEditor Config Presentation Util . path ( header ) ĊĠĠĠĠĠ Ġval Ġautom aton Ġ= ĠRegExp ( sanitize Glob ( internal Text , Ġpath )). to Automaton () ĊĠĠĠĠĠ ĠCached Value Provider . Result . create ( autom aton , Ġheader ) ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ pattern ] Ġis Ġis Ġassumed Ġto Ġbelong Ġto Ġa Ġvalid Ġheader ĊĠĠ Ġ* Ġ( i . e . Ġpattern . header . isValid Glob ) ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Cached Pattern Automaton ( pattern : ĠEditor Config Pattern ): ĠAutom aton Ġ= ĊĠĠĠ ĠCached Values Manager . get Cached Value ( pattern , ĠKEY _ EDITOR CONFIG _ ELEMENT _ AUT OM AT ON ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtext Ġ= Ġpattern . text ĊĠĠĠĠĠ Ġval Ġheader Ġ= Ġpattern . header ĊĠĠĠĠĠ ĠLog . assertTrue ( header . isValid Glob , Ġ" builder Ġwas Ġgiven Ġa Ġpattern Ġin Ġinvalid Ġheader : Ġ$ text Ġin Ġ${ header . text }") ĊĠĠĠĠĠ ĠLog . assertTrue ( header . text Length Ġ>= Ġ 3 , Ġ" builder Ġwas Ġgiven Ġa Ġpattern Ġin Ġheader Ġof Ġins ufficient Ġlength : Ġ$ text Ġin Ġ${ header . text }") ĊĠĠĠĠĠ Ġval Ġpath Ġ= ĠEditor Config Presentation Util . path ( pattern ) ĊĠĠĠĠĠ Ġval Ġglob Ġ= Ġsanitize Glob ( text , Ġpath ) ĊĠĠĠĠĠ Ġval Ġautom aton Ġ= ĠRegExp ( glob ). to Automaton () ĊĠĠĠĠĠ ĠCached Value Provider . Result . create ( autom aton , Ġpattern ) ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġsanitize Glob ( text : ĠString , Ġpath : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġsource Ġ= Ġtext . replace ( File . separator Char , Ġ'/') ĊĠĠĠ Ġsource Ġ= Ġsource . replace (" \\\\ # ", Ġ"# ") ĊĠĠĠ Ġsource Ġ= Ġsource . replace (" \\\\ ;", Ġ"; ") ĊĠĠĠ Ġval Ġseparator Ġ= Ġsource . indexOf ("/") ĊĠĠĠ Ġif Ġ( separator Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġsource Ġ= Ġpath . replace ( File . separator Char , Ġ'/') Ġ+ Ġ"/" Ġ+ Ġif Ġ( separator Ġ== Ġ 0 ) Ġsource . substring ( 1 ) Ġelse Ġsource ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġsource Ġ= Ġ"** /$ source " ĊĠĠĠ Ġ} ĊĠĠĠ Ġsource Ġ= ĠEditor Config . convert Glob To Reg Ex ( source , Ġarray ListOf ()) ĊĠĠĠ Ġreturn Ġsource . replace (" (?: ", Ġ"(" ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval ĠLog Ġ= Ġlogger < Editor Config Automaton Builder >() Ċ } Ċ