package Ġjet brains . build Server . server . query lang . ast Ċ Ċ import Ġjet brains . build Server . server . query lang . read From Resources Ċ import Ġjava . io . File Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ import Ġkotlin . reflect . full . is Super class Of Ċ Ċ object ĠFilter Registration Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdescriptions Ġ: ĠMutable Map < String , ĠFilter Description > Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġval Ġshort Descriptions : ĠMutable Map < String , ĠDescri ptions > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġval Ġany Condition Container Ġ= Ġobject Ġ: ĠCondition Container < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcondition : ĠCondition AST < Any > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠNone Condition AST () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnames : ĠList < String > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval Inner (): ĠEval Result < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEval Result ( None Object Filter (), Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfilter Graph : ĠMutable Map < ĠK Class < out ĠCondition Container <* >> Ġ, ĠMutable Set < K Class < out ĠFilter <* >>> Ġ> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġval Ġrev Filter Graph : ĠMutable Map Ġ< ĠK Class < out ĠFilter <* >>, ĠMutable Set < K Class < out ĠCondition Container <* >>> Ġ> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġval Ġmodifier Graph : ĠMutable Map Ġ< ĠK Class < out ĠFilter <* >>, ĠMutable Set < K Class < out ĠFilter Modifier <* >> Ġ> Ġ> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġval Ġreversed Modifier Graph : ĠMutable Map < ĠK Class < out ĠFilter Modifier <* >>, ĠMutable Set < ĠK Class < Ġout ĠFilter < *> Ġ> Ġ> Ġ> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġval Ġcondition Containers : ĠMutable Map < ĠK Class < out ĠCondition Container <* >>, ĠK Class <* >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġval Ġfilters : ĠMutable Map Ġ< ĠK Class < out ĠFilter <* >>, ĠK Class < *> Ġ> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġval Ġmodifiers : ĠMutable Map Ġ< ĠK Class < out ĠFilter Modifier <* >>, ĠK Class < *> Ġ> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Condition Container ( Project TopLevel Query :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Container ( Build Conf TopLevel Query :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Container ( Template TopLevel Query :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Container ( V cs Root TopLevel Query :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Container ( Meta Runner TopLevel Query :: class ) ĊĊĠĠĠĠĠĠĠ Ġregister Filter ( Equals String Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Prefix String Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Suffix String Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Substring Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Enabled Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Clean Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( String Param Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Any String Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Collector String Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Collector String Param Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Filter ( Arch ived Filter :: class ) ĊĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Id Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Build Conf Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( V cs Root Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Project Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Parent Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Trigger Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Step Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Feature Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Template Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Parameter Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Value Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Ancestor Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( V cs Root Entry Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Rules Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Dependency Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Artifact Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Snapshot Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Rev Rule Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Option Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Type Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Name Filter :: class ) ĊĠĠĠĠĠĠĠ Ġregister Condition Filter ( Sub Project Filter :: class ) ĊĊĠĠĠĠĠĠĠ Ġ// modifier Ġregistration Ġshould Ġbe Ġpero formed Ġonly Ġafter Ġfilter Ġregistration ĊĠĠĠĠĠĠĠ Ġregister Modifier ( Resolved Filter Modifier :: class ) ĊĠĠĠĠĠĠĠ Ġregister Modifier ( With Inherited Filter Modifier :: class ) ĊĠĠĠĠĠĠĠ Ġregister Modifier ( All Filter Modifier :: class ) ĊĊĠĠĠĠĠĠĠ Ġload Description () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Filter Graph () Ġ= Ġfilter Graph . toMap () ĊĊĠĠĠ Ġfun Ġget Modifier Graph () Ġ= Ġmodifier Graph . toMap () ĊĊĠĠĠ Ġfun Ġget Filters () Ġ= Ġfilters . keys . toList () ĊĊĠĠĠ Ġfun Ġget Modifiers () Ġ= Ġmodifiers . keys . toList () ĊĊĠĠĠ Ġfun Ġget Condition Containers () Ġ= Ġcondition Containers . keys . toList () ĊĊĠĠĠ Ġfun Ġprint a All Relations () Ġ{ ĊĠĠĠĠĠĠĠ Ġfilter Graph . forEach Ġ{( fc , Ġf sub c ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ fc . simple Name } (${ fc . getName () }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( f sub c . join ToString ( separator Ġ= Ġ", Ġ") Ġ{" ${ it . simple Name } (${ it . getName () }) "}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Be Sub filter ( filter : ĠK Class < out ĠCondition Container <* >>, Ġsub f : ĠK Class < out ĠFilter <* >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filter Ġ== Ġany Condition Container :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfilter Graph [ filter ]?. contains ( sub f ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Be Modifier ( filter : ĠK Class < out ĠFilter <* >>, Ġmodifier : ĠK Class < out ĠFilter Modifier <* >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodifier Graph [ filter ]?. contains ( modifier ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Possible Condition Containers ( filter Class : ĠK Class < out ĠFilter <* >> ): ĠSet < K Class < out ĠCondition Container <* >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrev Filter Graph [ filter Class ]?. toSet () Ġ?: Ġempty Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Possible Filters ( modifier : ĠK Class < out ĠFilter Modifier <* >> ): ĠSet < K Class < out ĠFilter <* >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreversed Modifier Graph [ modifier ]?. toSet () Ġ?: Ġempty Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Short Description ( filter Name : ĠString , Ġcontext : ĠList < String >): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġshort Descriptions [ filter Name ]?. getDescription ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetDescription ByName ( filter Name : ĠString ): ĠFilter Description ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdescriptions [ filter Name ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetDescription ( filter Class : ĠK Class < out ĠFilter <* >> ): ĠFilter Description ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfilter Class . getName ()?. let Ġ{ Ġdescriptions [ it ] Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠObj Ġ: ĠAny , re ified ĠNested Obj Ġ: ĠAny > Ġregister Condition Filter ( filter : ĠK Class < out ĠCondition Filter < Obj , ĠNested Obj >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Filter ( filter ) ĊĠĠĠĠĠĠĠ Ġregister Condition Container ( filter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠObj > Ġregister Filter ( filter : ĠK Class < out ĠFilter < Obj >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġfilters [ filter ] Ġ= ĠObj :: class ĊĊĠĠĠĠĠĠĠ Ġsave Short Description ( filter ) ĊĊĠĠĠĠĠĠĠ Ġcondition Containers . forEach Ġ{( filter Class , Ġobj Types ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Obj :: class . is Super class Of ( obj Types )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Filter Edge ( filter Class , Ġfilter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠNested Obj > Ġregister Condition Container ( condition Container : ĠK Class < out ĠCondition Container < Nested Obj >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġcondition Containers [ condition Container ] Ġ= ĠNested Obj :: class ĊĊĠĠĠĠĠĠĠ Ġsave Short Description ( condition Container ) ĊĊĠĠĠĠĠĠĠ Ġfilters . forEach Ġ{( filter Class , Ġobj Type ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Type . is Super class Of ( Nested Obj :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Filter Edge ( condition Container , Ġfilter Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun < re ified ĠT > Ġregister Modifier ( modifier Class : ĠK Class < out ĠFilter Modifier < T >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodifiers [ modifier Class ] Ġ= ĠT :: class ĊĊĠĠĠĠĠĠĠ Ġsave Short Description ( modifier Class ) ĊĊĠĠĠĠĠĠĠ Ġfilters . forEach Ġ{ Ġ( filter Class , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Class . is Subclass Of ( T :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Graph . get Or Put ( filter Class , Ġ{ Ġmutable Set Of ()} ). add ( modifier Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreversed Modifier Graph . get Or Put ( modifier Class , Ġ{ Ġmutable Set Of ()} ). add ( filter Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Filter Edge ( condition Container : ĠK Class < out ĠCondition Container <* >>, Ġfilter : ĠK Class < out ĠFilter <* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġfilter Graph . get Or Put ( condition Container , Ġ{ Ġmutable Set Of ()} ). add ( filter ) ĊĠĠĠĠĠĠĠ Ġrev Filter Graph . get Or Put ( filter , Ġ{ Ġmutable Set Of ()} ). add ( condition Container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Short Description ( obj : ĠK Class < out ĠNamed >) Ġ{ ĊĠĠĠĠĠĠĠ Ġobj . get Descriptions ()?. let Ġ{ descr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . getName ()?. let Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort Descriptions [ name ] Ġ= Ġshort Descriptions [ name ]?. add ( descr ) Ġ?: Ġdescr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Description () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġreadme Text Ġ= Ġthis . read From Resources (" FOR _ USERS . md ") ĊĠĠĠĠĠĠĠ Ġvar Ġlast Index Ġ= Ġreadme Text . indexOf (" Filters Ġdescription ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġreadme Text . substring ( last Index , Ġreadme Text . indexOf (" ### ", Ġlast Index )) ĊĊĠĠĠĠĠĠĠ Ġlast Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun ĠString . substring Until ( c : ĠChar , ĠstartIndex : ĠInt Ġ= Ġ 0 ): ĠPair < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġind Ġ= Ġthis . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġloop @{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( startIndex Ġuntil Ġthis . length ). forEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this [ i ] Ġ== Ġc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġind Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ+= Ġthis [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( res , Ġind ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( last Index Ġ< Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Index Ġ= Ġtext . indexOf ("\ n * Ġ", Ġlast Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Index Ġ= Ġtext . indexOf (" ** ", Ġlast Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Name Ġ= Ġtext . substring ( last Index Ġ+ Ġ 2 , Ġtext . indexOf (" ** ", Ġlast Index Ġ+ Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Index Ġ= Ġtext . indexOf ("- ", Ġlast Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( descr , Ġn last Index ) Ġ= Ġtext . substring Until ('\ n ', Ġlast Index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Index Ġ= Ġtext . indexOf ("* example :* ", Ġn last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( ex amp , Ġn last Index 1 ) Ġ= Ġtext . substring Until ('\ n ', Ġlast Index Ġ+ Ġ 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Index Ġ= Ġn last Index 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptions [ filter Name ] Ġ= ĠFilter Description ( descr . trim (), Ġex amp . trim ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< Nested Obj > ĠFilter <* >. check And Cast ( filter : ĠK Class < out ĠCondition Container < Nested Obj >> ): ĠFilter < Nested Obj >? Ġ{ ĊĠĠĠ Ġval Ġres Ġ= Ġthis Ġas ? ĠFilter < Nested Obj > ĊĠĠĠ Ġif Ġ(! Filter Registration . can Be Sub filter ( filter , Ġthis :: class )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġres Ċ } Ċ Ċ data Ġclass ĠFilter Description ( val Ġdescr : ĠString , Ġval Ġexample : ĠString ) Ċ