package Ġic u . win dea . pl s . c wt . config Ċ Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . util .* Ċ import Ġic u . win dea . pl s .* Ċ import Ġic u . win dea . pl s . c wt . expression .* Ċ import Ġic u . win dea . pl s . c wt . psi .* Ċ import Ġic u . win dea . pl s . model .* Ċ import Ġjava . util .* Ċ Ċ data Ġclass ĠC wt Definition Config ( Ċ ĉ override Ġval Ġpointer : ĠSmart Psi Element Pointer < C wt Property >, Ċ ĉ val Ġname : ĠString , Ċ ĉ val Ġconfigs : ĠList < Pair < String ?, ĠC wt Property Config >> Ġ// ( subtype Expression , Ġprop Config ) Ċ ) Ġ: ĠC wt Config < C wt Property > Ġ{ Ċ ĉ // ä½¿çĶ¨ Weak HashMap Ġ- Ġ åĩı å°ĳ åĨħåŃĺ åįł çĶ¨ Ċ ĉ private Ġval Ġmerge Configs Cache Ġ= ĠWeak HashMap < String , ĠList < C wt Property Config >>() Ċ ĉ private Ġval Ġproperty Configs Cache Ġ= ĠWeak HashMap < String , ĠList < C wt Property Config >>() Ċ ĉ private Ġval Ġchild Property Configs Cache Ġ= ĠWeak HashMap < String , ĠList < C wt Property Config >>() Ċ ĉ private Ġval Ġchild Value Configs Cache Ġ= ĠWeak HashMap < String , ĠList < C wt Value Config >>() ĊĉĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® åŃĲ ç±»åŀĭ åĪĹè¡¨ åĲĪå¹¶ éħįç½® ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġmerge Configs ( sub types : ĠList < String >): ĠList < C wt Property Config > Ġ{ Ċĉ ĉ val Ġcache Key Ġ= Ġsub types . join ToString (",") Ċĉ ĉ return Ġmerge Configs Cache . get Or Put ( cacheKey ) Ġ{ Ċĉĉ ĉ val Ġresult Ġ= ĠSmart List < C wt Property Config >() Ċĉĉ ĉ for (( subtype Expression , Ġprop Config ) Ġin Ġconfigs ) Ġ{ Ċĉĉĉ ĉ if ( subtype Expression Ġ== Ġnull Ġ|| Ġmatches Subtype Expression ( subtype Expression , Ġsub types )) Ġ{ Ċĉĉĉĉ ĉ result . add ( prop Config ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ result Ċĉ ĉ } Ċ ĉ } ĊĉĊĉĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® è·¯å¾Ħ è§£æŀĲ å¯¹åºĶçļĦ å±ŀæĢ§ éħįç½® åĪĹè¡¨ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġresolve Property Configs ( sub types : ĠList < String >, Ġpath : ĠPar ad ox Property Path , Ċĉ ĉ config Group : ĠC wt Config Group ): ĠList < C wt Property Config > Ġ{ Ċĉ ĉ val Ġcache Key Ġ= Ġ"${ sub types . join ToString (",") }: $ path " Ċĉ ĉ return Ġproperty Configs Cache . get Or Put ( cacheKey ) Ġ{ Ċĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ // è¿ĻéĩĮ çļĦ å±ŀæĢ§ è·¯å¾Ħ ä¸į åºĶè¯¥ ä¸ºç©º Ċĉĉĉ ĉ path . isEmpty () Ġ-> Ġempty List () Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ var Ġresult Ġ= Ġmerge Configs ( sub types ) Ċĉĉĉĉ ĉ var Ġis Top Ġ= Ġtrue Ċĉĉĉĉ ĉ for (( key , Ġquoted ) Ġin Ġpath . sub Path Infos ) Ġ{ Ċĉĉĉĉĉ ĉ // å¦Ĥæŀľ æĺ¯ é¡¶ çº§ çļĦ å°± ä¸įè¦ģ æīĵ å¹³ ï¼Į åĲ¦åĪĻ è¦ģ æīĵ å¹³ ï¼Į çĦ¶åĲİ è¿ĺ éľĢè¦ģ æł¹æį® æĺ¯åĲ¦ åĮ¹éħį key Expression è¿Ľè¡Į è¿ĩæ»¤ Ċĉĉĉĉĉ ĉ // å¦Ĥæŀľ æķ´ä¸ª è¿ĩç¨ĭä¸Ń å¾ĹåĪ° çļĦ æŁĲä¸ª property Config çļĦ value Expression Type æĺ¯ single _ alias _ right æĪĸ alias _ matches _ left Ċĉĉĉĉĉ ĉ // åĪĻ éľĢè¦ģ åĨħ èģĶ è¿ĻäºĽ è§ĦåĪĻ Ċĉĉĉĉĉ ĉ if ( is Top ) Ġ{ Ċĉĉĉĉĉĉ ĉ is Top Ġ= Ġfalse Ċĉĉĉĉĉĉ ĉ val Ġnext Result Ġ= ĠSmart List < C wt Property Config >() Ċĉĉĉĉĉĉ ĉ for ( config Ġin Ġresult ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ if ( matches Key ( config . key Expression , Ġkey , Ġquoted , Ġconfig Group )) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ // å¦Ĥæŀľ value Expression Type æĺ¯ single _ alias _ right æĪĸ alias _ match _ left , åĪĻ è¦ģ è¿Ľè¡Į åĨħ èģĶ Ċĉĉĉĉĉĉĉĉ ĉ val Ġin lined Ġ= Ġinline Config ( key , Ġquoted , Ġconfig , Ġconfig Group , Ġnext Result ) Ċĉĉĉĉĉĉĉĉ ĉ if (! in lined ) Ġnext Result . add ( config ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ result Ġ= Ġnext Result Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġnext Result Ġ= ĠSmart List < C wt Property Config >() Ċĉĉĉĉĉĉ ĉ for ( r Ġin Ġresult ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ val Ġconfigs Ġ= Ġr . properties Ċĉĉĉĉĉĉĉ ĉ if ( configs Ġ!= Ġnull Ġ&& Ġconfigs . isNotEmpty ()) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ for ( config Ġin Ġconfigs ) Ġ{ Ċĉĉĉĉĉĉĉĉĉ ĉ if ( matches Key ( config . key Expression , Ġkey , Ġquoted , Ġconfig Group )) Ġ{ Ċĉĉĉĉĉĉĉĉĉĉ ĉ // å¦Ĥæŀľ value Expression Type æĺ¯ single _ alias _ right æĪĸ alias _ match _ left , åĪĻ è¦ģ è¿Ľè¡Į åĨħ èģĶ Ċĉĉĉĉĉĉĉĉĉĉ ĉ val Ġin lined Ġ= Ġinline Config ( key , Ġquoted , Ġconfig , Ġconfig Group , Ġnext Result ) Ċĉĉĉĉĉĉĉĉĉĉ ĉ if (! in lined ) Ġnext Result . add ( config ) Ċĉĉĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ result Ġ= Ġnext Result Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ result Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® è·¯å¾Ħ è§£æŀĲ å¯¹åºĶçļĦ åŃĲ å±ŀæĢ§ éħįç½® åĪĹè¡¨ ãĢĤ ï¼Ī è¿ĩæ»¤ éĩįå¤į çļĦ ï¼ī Ċĉ Ġ*/ Ċ ĉ fun Ġresolve Child Property Configs ( sub types : ĠList < String >, Ġpath : ĠPar ad ox Property Path , Ġconfig Group : ĠC wt Config Group ): ĠList < C wt Property Config > Ġ{ Ċĉ ĉ val Ġcache Key Ġ= Ġ"${ sub types . join ToString (",") }: $ path " Ċĉ ĉ return Ġchild Property Configs Cache . get Or Put ( cacheKey ) Ġ{ Ċĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ // è¿ĻéĩĮ çļĦ å±ŀæĢ§ è·¯å¾Ħ åı¯ä»¥ ä¸ºç©º ï¼Į è¿Ļ æĹ¶ å¾ĹåĪ° çļĦ å°±æĺ¯ é¡¶ çº§ å±ŀæĢ§ åĪĹè¡¨ Ċĉĉĉ ĉ path . isEmpty () Ġ-> Ġmerge Configs ( sub types ) Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ // æīĵ å¹³ property Configs ä¸ŃçļĦ æ¯ı ä¸Ģä¸ª properties Ċĉĉĉĉ ĉ val Ġproperty Configs Ġ= Ġresolve Property Configs ( sub types , Ġpath , Ġconfig Group ) Ċĉĉĉĉ ĉ val Ġresult Ġ= ĠSmart List < C wt Property Config >() Ċĉĉĉĉ ĉ for ( property Config Ġin Ġproperty Configs ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġprops Ġ= Ġproperty Config . properties Ċĉĉĉĉĉ ĉ if ( props Ġ!= Ġnull Ġ&& Ġprops . isNotEmpty ()) Ġresult . addAll ( props ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ result Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ }. distinct By Ġ{ Ġit . key Ġ} Ċ ĉ } ĊĉĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® è·¯å¾Ħ è§£æŀĲ å¯¹åºĶçļĦ åŃĲ åĢ¼ éħįç½® åĪĹè¡¨ ãĢĤ ï¼Ī è¿ĩæ»¤ éĩįå¤į çļĦ ï¼ī Ċĉ Ġ*/ Ċ ĉ fun Ġresolve Child Values Configs ( sub types : ĠList < String >, Ġpath : ĠPar ad ox Property Path , Ġconfig Group : ĠC wt Config Group ): ĠList < C wt Value Config > Ġ{ Ċĉ ĉ val Ġcache Key Ġ= Ġ"${ sub types . join ToString (",") }$ path " Ċĉ ĉ return Ġchild Value Configs Cache . get Or Put ( cacheKey ) Ġ{ Ċĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ // è¿ĻéĩĮ çļĦ å±ŀæĢ§ è·¯å¾Ħ åı¯ä»¥ ä¸ºç©º ï¼Į è¿Ļ æĹ¶ å¾ĹåĪ° çļĦæĺ¯ ç©º åĪĹè¡¨ ï¼Ī åģĩ å®ļ åľ¨ é¡¶ çº§ çļĦæĺ¯ å±ŀæĢ§ ä¸įæĺ¯ åĢ¼ ï¼ī Ċĉĉĉ ĉ path . isEmpty () Ġ-> Ġempty List () Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ // æīĵ å¹³ property Configs ä¸ŃçļĦ æ¯ı ä¸Ģä¸ª values Ċĉĉĉĉ ĉ val Ġproperty Configs Ġ= Ġresolve Property Configs ( sub types , Ġpath , Ġconfig Group ) Ċĉĉĉĉ ĉ val Ġresult Ġ= ĠSmart List < C wt Value Config >() Ċĉĉĉĉ ĉ for ( property Config Ġin Ġproperty Configs ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġvalues Ġ= Ġproperty Config . values Ċĉĉĉĉĉ ĉ if ( values Ġ!= Ġnull Ġ&& Ġvalues . isNotEmpty ()) Ġresult . addAll ( values ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ result Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ }. distinct By Ġ{ Ġit . value Ġ} Ċ ĉ } ĊĉĊ ĉ /** Ċĉ Ġ* Ġ åĨħ èģĶ ç±»åŀĭ ä¸º ` single _ alias _ right ` æĪĸ ` alias _ match _ left ` çļĦ è§ĦåĪĻ ãĢĤ ä»¥ ä¾¿ åĲİ ç»Ń çļĦä»£çłģ æıĲç¤º ãĢģ å¼ķçĶ¨ è§£æŀĲ åĴĮ ç»ĵæŀĦ éªĮè¯ģ ãĢĤ Ċĉ Ġ*/ Ċ ĉ private Ġfun Ġinline Config ( key : ĠString , Ġquoted : ĠBoolean , Ġconfig : ĠC wt Property Config , Ġconfig Group : ĠC wt Config Group , Ċĉ ĉ result : ĠMutable List < C wt Property Config >): ĠBoolean Ġ{ Ċĉ ĉ val Ġvalue Expression Ġ= Ġconfig . value Expression Ċĉ ĉ return Ġwhen ( value Expression . type ) Ġ{ Ċĉĉ ĉ C wt Value Expression . Type . Single Alias Right Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġsingle Alias Name Ġ= Ġvalue Expression . value Ġ?: Ġreturn Ġfalse Ċĉĉĉ ĉ val Ġsingle Aliases Ġ= Ġconfig Group . single Aliases [ single Alias Name ] Ġ?: Ġreturn Ġfalse Ċĉĉĉ ĉ for ( single Alias Ġin Ġsingle Aliases ) Ġ{ Ċĉĉĉĉ ĉ val Ġc Ġ= Ġsingle Alias . config . copy ( Ċĉĉĉĉĉ ĉ pointer Ġ= Ġconfig . pointer , Ġkey Ġ= Ġconfig . key , Ġkey Expression Ġ= Ġconfig . key Expression , Ċĉĉĉĉĉ ĉ options Ġ= Ġconfig . options , Ġoption Values Ġ= Ġconfig . option Values , Ġdocumentation Ġ= Ġconfig . documentation Ċĉĉĉĉ ĉ ) Ċĉĉĉĉ ĉ c . parent Ġ= Ġconfig . parent Ċĉĉĉĉ ĉ result . add ( c ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ true Ċĉĉ ĉ } Ċĉĉ ĉ C wt Value Expression . Type . Alias Match Left Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġalias Name Ġ= Ġvalue Expression . value Ġ?: Ġreturn Ġfalse Ċĉĉĉ ĉ val Ġalias Group Ġ= Ġconfig Group . aliases [ alias Name ] Ġ?: Ġreturn Ġfalse Ċĉĉĉ ĉ val Ġalias Sub Name Ġ= Ġresolve Alias Sub Name Expression ( key , Ġquoted , Ġalias Group , Ġconfig Group ) Ġ?: Ġreturn Ġfalse Ċĉĉĉ ĉ val Ġaliases Ġ= Ġalias Group [ alias Sub Name ] Ġ?: Ġreturn Ġfalse Ċĉĉĉ ĉ for ( alias Ġin Ġaliases ) Ġ{ Ċĉĉĉĉ ĉ val Ġc Ġ= Ġalias . config . copy ( Ċĉĉĉĉĉ ĉ pointer Ġ= Ġconfig . pointer , Ġkey Ġ= Ġconfig . key , Ġkey Expression Ġ= Ġconfig . key Expression , Ċĉĉĉĉĉ ĉ options Ġ= Ġconfig . options , Ġoption Values Ġ= Ġconfig . option Values , Ġdocumentation Ġ= Ġconfig . documentation Ċĉĉĉĉ ĉ ) Ċĉĉĉĉ ĉ c . parent Ġ= Ġconfig . parent Ċĉĉĉĉ ĉ result . add ( c ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ true Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġfalse Ċĉ ĉ } Ċ ĉ } Ċ } ĊĊ