// Ġ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 . language . services . impl Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . util . text . Case Ins ensitive String Hash ing Strategy Ċ import Ġg nu . tro ve . TH ash Map Ċ import Ġorg . editor config . language . schema . descriptors . impl . Editor Config Option Descriptor Ċ import Ġorg . editor config . language . util . Editor Config Descriptor Util Ċ Ċ class ĠEditor Config Option Descriptor Storage ( source : ĠIterable < Editor Config Option Descriptor >) Ġ{ ĊĠ Ġval Ġall Descriptors : ĠList < Editor Config Option Descriptor > ĊĠ Ġprivate Ġval Ġdescriptors : ĠMap < String , ĠList < Editor Config Option Descriptor >> ĊĠ Ġprivate Ġval Ġbad Descriptors : ĠList < Editor Config Option Descriptor > ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġall Descriptors Ġ= Ġmutable ListOf < Editor Config Option Descriptor >() ĊĠĠĠ Ġval Ġdescriptors Ġ= ĠT HashMap < String , ĠMutable List < Editor Config Option Descriptor >>( Case Ins ensitive String Hash ing Strategy ()) ĊĠĠĠ Ġval Ġbad Descriptors Ġ= Ġmutable ListOf < Editor Config Option Descriptor >() ĊĠĠĠ Ġsource . forEach Ġ{ Ġoption Descriptor Ġ-> ĊĠĠĠĠĠ Ġall Descriptors . add ( option Descriptor ) ĊĠĠĠĠĠ Ġval Ġkey Ġ= Ġoption Descriptor . key ĊĠĠĠĠĠ Ġval Ġconstants Ġ= ĠEditor Config Descriptor Util . find Constants ( key ) ĊĠĠĠĠĠ Ġif Ġ( constants . isEmpty ()) Ġbad Descriptors . add ( option Descriptor ) ĊĠĠĠĠĠ Ġelse Ġconstants . forEach Ġ{ Ġconstant Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġpresent List Ġ= Ġdescriptors [ constant ] ĊĠĠĠĠĠĠĠ Ġif Ġ( present List Ġ!= Ġnull ) Ġpresent List . add ( option Descriptor ) ĊĠĠĠĠĠĠĠ Ġelse Ġdescriptors [ constant ] Ġ= Ġmutable ListOf ( option Descriptor ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġthis . all Descriptors Ġ= Ġall Descriptors ĊĠĠĠ Ġthis . descriptors Ġ= Ġdescriptors ĊĠĠĠ Ġthis . bad Descriptors Ġ= Ġbad Descriptors ĊĠ Ġ} ĊĊĠ Ġoperator Ġfun Ġget ( key : ĠPsi Element , Ġparts : ĠList < String >) Ġ= Ġparts . flatMap NotNull Ġ{ ĊĠĠĠ Ġdescriptors [ it ] ĊĠ Ġ}. first OrNull Ġ{ ĊĠĠĠ Ġit . key . matches ( key ) ĊĠ Ġ} Ġ?: Ġbad Descriptors . first OrNull Ġ{ ĊĠĠĠ Ġit . key . matches ( key ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġinline Ġfun Ġ< T , ĠR Ġ: ĠAny > ĠIterable < T >. flatMap NotNull ( transform : Ġ( T ) Ġ-> ĠIterable < R ?> ?): ĠList < R > Ġ{ ĊĠĠĠ Ġreturn Ġflat Map NotNull To ( ArrayList (), Ġtransform ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġinline Ġfun Ġ< T , ĠR Ġ: ĠAny , ĠC Ġ: ĠMutable Collection < in ĠR >> ĠIterable < T >. flatMap NotNull To ( ĊĠĠĠ Ġdestination : ĠC , ĊĠĠĠ Ġtransform : Ġ( T ) Ġ-> ĠIterable < R ?> ? ĊĠ Ġ): ĠC Ġ{ ĊĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠ Ġtransform ( element )?. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġit ?. let ( destination :: add ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdestination ĊĠ Ġ} Ċ Ċ } Ċ