package Ġio . kot est . core Ċ Ċ import Ġio . kot est . core . spec . Spec Ċ import Ġio . kot est . core . tags . Expression Ċ import Ġio . kot est . core . tags . Parser Ċ import Ġio . kot est . core . tags . asString Ċ import Ġio . kot est . core . tags . expression Ċ import Ġio . kot est . mpp . annotation Ċ import Ġkotlin . reflect . K Class Ċ Ċ enum Ġclass ĠInclude Exclude Ġ{ ĊĠĠ ĠInclude d , ĠExclude d , ĠNone Ċ } Ċ Ċ /** Ċ Ġ* ĠRuntime Ġstatus Ġof Ġtags . Ċ Ġ*/ Ċ data Ġclass ĠTags ( val Ġexpression : ĠExpression ?) Ġ{ ĊĊĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠ Ġval ĠEmpty Ġ= ĠTags ( null ) ĊĊĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( expression : ĠString ) Ġ= ĠTags ( Parser . from ( expression ). expression ()) ĊĊĠĠĠĠĠ Ġfun Ġexclude ( tag : ĠTag ): ĠTags Ġ= ĠTags (" !" Ġ+ Ġtag . name ) ĊĠĠĠĠĠ Ġfun Ġinclude ( tag : ĠTag ): ĠTags Ġ= ĠTags ( tag . name ) ĊĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠBack wards Ġcompatible Ġversion Ġof Ġtags . ĠNote , Ġthis Ġway Ġyou Ġcannot Ġdo ĠAND s ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( included : ĠSet < Tag >, Ġexcluded : ĠSet < Tag >): ĠTags Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠ Ġincluded . isEmpty () Ġ&& Ġexcluded . isEmpty () Ġ-> ĠEmpty ĊĠĠĠĠĠĠĠĠ Ġincluded . isEmpty () Ġ-> ĠTags ( excluded . join ToString (" Ġ| Ġ") Ġ{ Ġ" !" Ġ+ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠ Ġexcluded . isEmpty () Ġ-> ĠTags ( included . join ToString (" Ġ| Ġ") Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincluded . join ToString (" Ġ| Ġ", Ġ" (", Ġ") ") Ġ{ Ġit . name Ġ} Ġ+ Ġ" Ġ& Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexcluded . join ToString (" Ġ| Ġ", Ġ" (", Ġ") ") Ġ{ Ġ" !" Ġ+ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun ĠisActive ( tag : ĠTag ): ĠBoolean Ġ= ĠisActive ( set Of ( tag )) ĊĊĠĠ Ġfun Ġcombine ( other : ĠTags ): ĠTags Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġthis . expression Ġ== Ġnull Ġ-> Ġother ĊĠĠĠĠĠ Ġother . expression Ġ== Ġnull Ġ-> Ġthis ĊĠĠĠĠĠ Ġelse Ġ-> ĠTags ( this . expression . asString () Ġ+ Ġ" Ġ& Ġ" Ġ+ Ġother . expression . asString ()) ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġgiven ĠSpec Ġclass Ġcould Ġcontain Ġan Ġactive Ġtest Ġbased Ġon Ġfurther Ġtags . ĊĠĠĠ Ġ* ĠReturns Ġfalse Ġif Ġthe Ġspec Ġshould Ġbe Ġexp lict ly Ġexcluded ĊĠĠĠ Ġ*/ ĊĠĠ Ġfun Ġis Pot entially Active ( k class : ĠK Class < out ĠSpec >): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġ// Ġnothing Ġis Ġexcluded Ġif Ġthe Ġexpression Ġis Ġnull ĊĠĠĠĠĠ Ġif Ġ( expression Ġ== Ġnull ) Ġreturn Ġtrue ĊĊĠĠĠĠĠ Ġ// Ġif Ġthe Ġclass Ġis Ġnot Ġtagged Ġthen Ġit Ġis Ġnot Ġexcluded ĊĠĠĠĠĠ Ġval Ġtags Ġ= Ġk class . tags () ĊĠĠĠĠĠ Ġif Ġ( tags . isEmpty ()) Ġreturn Ġtrue ĊĊĠĠĠĠĠ Ġreturn Ġis Pot entially Active ( tags . toSet (), Ġexpression ) Ġ?: Ġtrue ĊĠĠ Ġ} ĊĊĠĠ Ġprivate Ġfun Ġis Pot entially Active ( tags : ĠSet < Tag >, Ġexpression : ĠExpression ): ĠBoolean ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . Or Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pot entially Active ( tags , Ġexpression . left ) Ġ?: Ġtrue Ġ|| Ġis Pot entially Active ( tags , Ġexpression . right ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . And Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pot entially Active ( tags , Ġexpression . left ) Ġ?: Ġtrue Ġ&& Ġis Pot entially Active ( tags , Ġexpression . right ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . Not Ġ-> Ġis Pot entially Active ( tags , Ġexpression . expr )?. not () ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . Identifier Ġ-> Ġif Ġ( tags . map Ġ{ Ġit . name Ġ}. contains ( expression . ident )) Ġtrue Ġelse Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġthe Ġgiven Ġset Ġof Ġtags Ġshould Ġbe Ġconsidered Ġactive Ġbased ĊĠĠĠ Ġ* Ġon Ġthe Ġcurrent Ġtag Ġexpression . ĊĠĠĠ Ġ*/ ĊĠĠ Ġfun ĠisActive ( tags : ĠSet < Tag >): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġ// Ġeverything Ġis Ġalways Ġactive Ġwhen Ġno Ġtag Ġexpression Ġis Ġprovided ĊĠĠĠĠĠ Ġif Ġ( expression Ġ== Ġnull ) Ġreturn Ġtrue ĊĠĠĠĠĠ Ġreturn Ġevaluate ( tags , Ġexpression ) ĊĠĠ Ġ} ĊĊĠĠ Ġprivate Ġfun Ġevaluate ( tags : ĠSet < Tag >, Ġexpression : ĠExpression ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . Or Ġ-> Ġevaluate ( tags , Ġexpression . left ) Ġ|| Ġevaluate ( tags , Ġexpression . right ) ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . And Ġ-> Ġevaluate ( tags , Ġexpression . left ) Ġ&& Ġevaluate ( tags , Ġexpression . right ) ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . Not Ġ-> Ġ! evaluate ( tags , Ġexpression . expr ) ĊĠĠĠĠĠĠĠĠ Ġis ĠExpression . Identifier Ġ-> Ġtags . map Ġ{ Ġit . name Ġ}. contains ( expression . ident ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġinclude ( tag : ĠTag ): ĠTags Ġ= Ġcombine ( Tags ( tag . name )) ĊĠĠ Ġfun Ġexclude ( tag : ĠTag ): ĠTags Ġ= Ġcombine ( Tags (" !" Ġ+ Ġtag . name )) Ċ } Ċ Ċ private Ġfun ĠInclude Exclude . invert (): ĠInclude Exclude Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠ ĠInclude Exclude . Included Ġ-> ĠInclude Exclude . Excluded ĊĠĠ ĠInclude Exclude . Excluded Ġ-> ĠInclude Exclude . Included ĊĠĠ ĠInclude Exclude . None Ġ-> Ġthis Ċ } Ċ Ċ fun ĠK Class <* >. tags (): ĠSet < Tag > Ġ{ ĊĠĠ Ġval Ġannotation Ġ= Ġannotation < io . kot est . core . annotation . Tags >() Ġ?: Ġreturn Ġempty Set < Tag >() ĊĠĠ Ġreturn Ġannotation . values . map Ġ{ ĠString Tag ( it ) Ġ}. toSet () Ċ } Ċ