package Ġcom . eny . i 1 8 n . plugin . tree Ċ Ċ import Ġcom . eny . i 1 8 n . plugin . factory . Localization Type Ċ import Ġcom . eny . i 1 8 n . plugin . key . lexer . Literal Ċ Ċ /** Ċ Ġ* ĠProperty Ġreference Ġrepresents ĠPsi Element Ġand Ġit 's Ġpath Ġfrom ĠJson Ġfile Ġroot Ċ Ġ*/ Ċ data Ġclass ĠProperty Reference < T >( ĊĠĠĠĠĠĠĠ Ġval Ġpath : ĠList < Literal >, ĊĠĠĠĠĠĠĠ Ġval Ġelement : ĠTree < T > ?, ĊĠĠĠĠĠĠĠ Ġval Ġun resolved : ĠList < Literal >, ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠLocalization Type , ĊĠĠĠĠĠĠĠ Ġval Ġis Pl ural : ĠBoolean Ġ= Ġfalse ) Ċ Ċ /** Ċ Ġ* ĠKey Ġresolving Ġutils Ċ Ġ*/ Ċ interface ĠComposite Key Resolver < T > Ġ{ ĊĊĠĠĠ Ġfun Ġresolve ( composite Key : ĠList < Literal >, Ġroot : ĠTree < T > ?, Ġplural Separator : ĠString , Ġtype : ĠLocalization Type ): ĠList < Property Reference < T >> Ġ= ĊĠĠĠĠĠĠĠ Ġtry To Resolve Pl ural ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Composite Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplural Separator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ List < String >} Ġcomposite Key ĠComposite Ġkey ( path ) Ġto Ġresolve ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ Psi Element ?} Ġroot ĠRoot Ġelement Ġto Ġfind Ġproperty Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ FileType } Ġtype ĠLocalization Ġsource Ġtype ĊĠĠĠĠ Ġ* ĠReturns ĠProperty Reference Ġby Ġcomposite Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresolve Composite Key ( composite Key : ĠList < Literal >, Ġroot : ĠTree < T > ?, Ġtype : ĠLocalization Type ): ĠProperty Reference < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcomposite Key . fold ( Property Reference ( listOf (), Ġroot , ĠlistOf (), Ġtype )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Reference , Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Reference . element Ġ!= Ġnull Ġ&& Ġproperty Reference . element . is Tree () Ġ&& Ġproperty Reference . un resolved . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġproperty Reference . element . find Child ( key . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġproperty Reference . copy ( un resolved Ġ= Ġproperty Reference . un resolved Ġ+ Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġproperty Reference . copy ( path Ġ= Ġproperty Reference . path Ġ+ Ġkey , Ġelement Ġ= Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġproperty Reference . copy ( un resolved Ġ= Ġproperty Reference . un resolved Ġ+ Ġkey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFix Ġfor Ġplural Ġkey Ġreference . ĊĠĠĠĠ Ġ* Ġ# ĊĠĠĠĠ Ġ* ĠConsider Ġcomposite Ġkey Ġ' sample : root . key . plural ' ĊĠĠĠĠ Ġ* Ġand Ġcorresponding Ġtree Ġin Ġsample . json : ĊĠĠĠĠ Ġ* Ġ" root ": Ġ{ ĊĠĠĠĠ Ġ* ĠĠ Ġ" key ": Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġ" plural - 1 ": Ġ" pl u 1 ", ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġ" plural - 2 ": Ġ" pl u 2 ", ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġ" plural - 5 ": Ġ" pl u 5 ", ĊĠĠĠĠ Ġ* ĠĠ Ġ} ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* ĠProperty Reference Ġfor Ġthis Ġcase Ġis ĠProperty Reference ( path Ġ= Ġ[" root ", Ġ" key "], Ġelement [ key ], Ġun resolved Ġ= Ġ[" plural "]) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtry To Resolve Pl ural ( property Reference : ĠProperty Reference < T >, Ġplural Separator : ĠString , Ġtype : ĠLocalization Type ): ĠList < Property Reference < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( property Reference . un resolved . size Ġ== Ġ 1 Ġ&& Ġproperty Reference . element Ġ!= Ġnull Ġ&& Ġproperty Reference . element . is Tree ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsingle Un resolved Key Ġ= Ġproperty Reference . un resolved [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpl urals Ġ= ĠlistOf (" 1 "," 2 "," 5 "). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Reference . element . find Child ("${ single Un resolved Key . text }${ plural Separator }$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Reference ( property Reference . path Ġ+ Ġsingle Un resolved Key , Ġit , ĠlistOf (), Ġtype , Ġis Pl ural Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( plurals . isEmpty ()) ĠlistOf ( property Reference ) Ġelse Ġpl urals ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠlistOf ( property Reference ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns ĠPsi Element Ġby Ġcomposite Ġkey Ġfrom Ġfile 's Ġroot Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresolve Composite Key Property ( composite Key : ĠList < Literal >, Ġroot : ĠTree < T > ?, Ġtype : ĠLocalization Type ): ĠTree < T >? Ġ= ĊĠĠĠĠĠĠĠ Ġresolve Composite Key ( composite Key , Ġroot , Ġtype ). let Ġ{ ref Ġ-> Ġif Ġ( ref . un resolved . isNotEmpty ()) Ġnull Ġelse Ġref . element } ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġkeys Ġat Ġcurrent Ġcomposite Ġkey Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlist Composite Key Variants ( fixed Key : ĠList < Literal >, Ġroot : ĠTree < T > ?, Ġprefix : ĠString , Ġtype : ĠLocalization Type ): ĠList < Tree < T >> Ġ= ĊĠĠĠĠĠĠĠ Ġresolve Composite Key Property ( fixed Key , Ġroot , Ġtype )?. find Children ( prefix ) Ġ?: ĠlistOf () Ċ }