/* Ċ Ġ* ĠMinecraft ĠDev Ġfor ĠIntelliJ Ċ Ġ* Ċ Ġ* Ġhttps :// minecraft dev . org Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 Ġm inecraft - dev Ċ Ġ* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ*/ Ċ Ċ package Ġcom . de mon wav . mc dev . i 1 8 n . translations Ċ Ċ import Ġcom . de mon wav . mc dev . facet . Minecraft Facet Ċ import Ġcom . de mon wav . mc dev . i 1 8 n . reference . I 1 8 n Reference Ċ import Ġcom . de mon wav . mc dev . platform . m cp . M cp Module Type Ċ import Ġcom . de mon wav . mc dev . platform . m cp . s rg . S rg Manager Ċ import Ġcom . de mon wav . mc dev . util . Member Reference Ċ import Ġcom . de mon wav . mc dev . util . evaluate Ċ import Ġcom . de mon wav . mc dev . util . extract Var Args Ċ import Ġcom . de mon wav . mc dev . util . find Module Ċ import Ġcom . de mon wav . mc dev . util . get Calls Ċ import Ġcom . de mon wav . mc dev . util . get Calls Return ing Result Ċ import Ġcom . de mon wav . mc dev . util . is Same Reference Ċ import Ġcom . de mon wav . mc dev . util . referenced Method Ċ import Ġcom . de mon wav . mc dev . util . substitute Parameter Ċ import Ġcom . intellij . psi . Psi Call Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġcom . intellij . psi . Psi Subst it utor Ċ Ċ class ĠTranslation Function ( private Ġval Ġmember Reference : ĠMember Reference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmatched Index : ĠInt , Ġval Ġformatting : ĠBoolean , Ġval Ġsetter : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfold Parameters : ĠBoolean Ġ= Ġfalse , Ġval Ġprefix : ĠString Ġ= Ġ"", Ġval Ġsuffix : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġob fuscated Name : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġget Method ( context : ĠPsi Element ): ĠPsi Method ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġreference Ġ= Ġmember Reference ĊĠĠĠĠĠĠĠ Ġif Ġ( ob fuscated Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule S rg Manager Ġ= Ġcontext . find Module ()?. let Ġ{ ĠMinecraft Facet . getInstance ( it , ĠM cp Module Type )?. s rg Manager Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs rg Manager Ġ= Ġmodule S rg Manager Ġ?: ĠS rg Manager . find Any Instance ( context . project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs rg Manager ?. s rg Map Now ?. map To M cp Method ( member Reference )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġreference . resolve Member ( context . project ) Ġas ? ĠPsi Method ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmatches ( call : ĠPsi Call , Ġparam Index : ĠInt ) Ġ= Ġget Calls ( call , Ġparam Index ). any () ĊĊĠĠĠ Ġprivate Ġfun Ġget Calls ( call : ĠPsi Call , Ġparam Index : ĠInt ): ĠIterable < Psi Call > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreference Method Ġ= Ġget Method ( call ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( setter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . get Calls ( reference Method , Ġparam Index , Ġmatched Index ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . get Calls Return ing Result ( reference Method , Ġparam Index , Ġmatched Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Translation Key ( call : ĠPsi Call ): ĠPair < Boolean , ĠString >? Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠStep ( val Ġpropagate : ĠBoolean , Ġval Ġvalid Reference : ĠBoolean , Ġval Ġkey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠPair ( valid Reference , Ġkey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresolve Call ( depth : ĠInt , Ġsingle : ĠBoolean , Ġreferenced : ĠPsi Method , Ġcall : ĠPsi Call , Ġacc : ĠStep ): ĠStep ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( acc . propagate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġacc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall . referenced Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Referenced Method Ġ= Ġreferenced . is Same Reference ( method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġcall . argument List ?. expressions ?. get ( matched Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Ġ!= Ġnull Ġ&& Ġparam Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparam . evaluate ( null , ĠI 1 8 n Reference . VARIABLE _ MARKER ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result . contains ( I 1 8 n Reference . VARIABLE _ MARKER ) Ġ&& Ġ( depth Ġ> Ġ 0 Ġ|| Ġis Referenced Method )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStep ( true , Ġsingle , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStep ( false , Ġtrue , Ġif Ġ( acc . key . contains ( I 1 8 n Reference . VARIABLE _ MARKER )) Ġresult . replace ( I 1 8 n Reference . VARIABLE _ MARKER , Ġacc . key ) Ġelse Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= Ġget Calls ( call , Ġmatched Index ) ĊĠĠĠĠĠĠĠ Ġval Ġreferenced Ġ= Ġget Method ( call ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcalls . fold Indexed ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStep ( false , Ġtrue , Ġ"") Ġas ĠStep ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdepth , Ġacc , Ġv Ġ-> Ġif Ġ( acc Ġ== Ġnull ) Ġacc Ġelse Ġresolve Call ( depth , Ġcalls . count () Ġ== Ġ 1 , Ġreferenced , Ġv , Ġacc ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ?. result ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ?. copy ( second Ġ= Ġprefix Ġ+ Ġresult . second Ġ+ Ġsuffix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat ( translation : ĠString , Ġtop Call : ĠPsi Call ): ĠPair < String , ĠInt >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! formatting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtranslation Ġto Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠNUMBER _ FORMAT TING _ PATTERN . replace ( translation , Ġ"% $ 1 s ") ĊĊĠĠĠĠĠĠĠ Ġfun Ġresolve Call ( call : ĠPsi Call , Ġsubstitution s : ĠMap < Int , ĠArray < String ?> ?> ): ĠMap < Int , ĠArray < String ?> ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall . referenced Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . argument List ?. expressions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( method Ġ!= Ġnull Ġ&& Ġargs Ġ!= Ġnull Ġ&& Ġargs . size Ġ>= Ġmethod . parameter List . parameters Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . parameter List . parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameter . is Var Args ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar arg Type Ġ= Ġmethod . get Signature ( Psi Subst it utor . EMPTY ). parameter Types [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( i , Ġextract Var Args ( var arg Type , Ġargs . drop ( i ), Ġsubstitution s , Ġtrue , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( i , Ġargs [ i ]. substitute Parameter ( subst itution s , Ġtrue , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġempty Map () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= Ġget Calls ( top Call , Ġmatched Index ) ĊĠĠĠĠĠĠĠ Ġval Ġparam Count Ġ= ĠSTRING _ FORMAT TING _ PATTERN . findAll ( format ). count () ĊĠĠĠĠĠĠĠ Ġval Ġsubstitution s Ġ= Ġif Ġ( calls . count () Ġ> Ġ 1 ) Ġcalls . take ( calls . count () Ġ- Ġ 1 ). fold ( empty Map < Int , ĠArray < String ?> ?> (), Ġ{ Ġacc , Ġv Ġ-> Ġresolve Call ( v , Ġacc ) Ġ}) Ġelse Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġreference Call Ġ= Ġif Ġ( calls . count () Ġ> Ġ 1 ) Ġcalls . last () Ġelse Ġcalls . first () ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġreference Call . referenced Method Ġ?: Ġreturn Ġtranslation Ġto Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġvar args Ġ= Ġreference Call . extract Var Args ( method . parameter List . parameters Count Ġ- Ġ 1 , Ġsubstitution s , Ġcalls . count () Ġ<= Ġ 1 , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġvar arg Start Ġ= Ġif Ġ( var args . size Ġ> Ġparam Count ) Ġmethod . parameter List . parameters Count Ġ- Ġ 1 Ġ+ Ġparam Count Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠ Ġreturn ĠString . format ( format , Ġ* var args ) Ġto Ġvar arg Start ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ member Reference @ $ matched Index " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠNUMBER _ FORMAT TING _ PATTERN Ġ= ĠRegex ("% (\\ d + \\ $ )? [ \\ d . ]* [ df ]") ĊĠĠĠĠĠĠĠ Ġval ĠSTRING _ FORMAT TING _ PATTERN Ġ= ĠRegex ("[ ^ %] ? % (?: \\ d + \\ $ )? s ") ĊĠĠĠ Ġ} Ċ } Ċ