/* Ċ Ġ* ĠMinecraft ĠDev Ġfor ĠIntelliJ Ċ Ġ* Ċ Ġ* Ġhttps :// minecraft dev . org Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 Ġm inecraft - dev Ċ Ġ* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ*/ Ċ Ċ package Ġcom . de mon wav . mc dev . platform . mixin . config . reference Ċ Ċ import Ġcom . de mon wav . mc dev . platform . mixin . util . Mixin Constants . Classes . MIX IN _ CONFIG Ċ import Ġcom . de mon wav . mc dev . platform . mixin . util . Mixin Constants . Classes . SERIAL IZED _ NAME Ċ import Ġcom . de mon wav . mc dev . util . constant StringValue Ċ import Ġcom . de mon wav . mc dev . util . find Annotation Ċ import Ġcom . de mon wav . mc dev . util . if Empty Ċ import Ġcom . de mon wav . mc dev . util . reference . Inspection Reference Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Builder Ċ import Ġcom . intellij . json . psi . JsonProperty Ċ import Ġcom . intellij . json . psi . Json StringLiteral Ċ import Ġcom . intellij . psi . Java Psi Facade Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi ClassType Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Field Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Reference Ċ import Ġcom . intellij . psi . Psi Reference Base Ċ import Ġcom . intellij . psi . Psi Reference Provider Ċ import Ġcom . intellij . util . Array Util Ċ import Ġcom . intellij . util . Processing Context Ċ Ċ object ĠConfig Property Ġ: ĠPsi Reference Provider () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget References By Element ( element : ĠPsi Element , Ġcontext : ĠProcessing Context ): ĠArray < Psi Reference > Ġ= ĊĠĠĠĠĠĠĠ ĠarrayOf ( Reference ( element Ġas ĠJson StringLiteral )) ĊĊĠĠĠ Ġfun Ġresolve Reference ( element : ĠJson StringLiteral ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Class Ġ= Ġfind Config Class ( element ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Property ( config Class , Ġelement . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Variants ( context : ĠPsi Element ): ĠArray < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Class Ġ= Ġfind Config Class ( context ) Ġ?: Ġreturn ĠArray Util . EMPTY _ OBJECT _ ARRAY ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Lookup Element Builder >() ĊĠĠĠĠĠĠĠ ĠforEach Property ( config Class ) Ġ{ Ġ_, Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Lookup Element Builder . create ( name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . toArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Property ( config Class : ĠPsi Class , Ġname : ĠString ): ĠPsi Field ? Ġ{ ĊĠĠĠĠĠĠĠ ĠforEach Property ( config Class ) Ġ{ Ġfield , ĠfieldName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fieldName Ġ== Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun ĠforEach Property ( config Class : ĠPsi Class , Ġfunc : Ġ( Psi Field , ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġconfig Class . fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . find Annotation ( SERIAL IZED _ NAME )?. find Declared AttributeValue ( null )?. constant StringValue Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunc ( field , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Config Class ( context : ĠPsi Element ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmixin Config Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJava Psi Facade . getInstance ( context . project ). find Class ( MIX IN _ CONFIG , Ġcontext . resolve Scope ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġcontext . parent Ġas ĠJson Property ĊĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠArrayList < String >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġproperty . parent ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull Ġ&& Ġcurrent Ġ! is ĠPsi File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġis ĠJson Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( current . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpath . if Empty Ġ{ Ġreturn Ġmixin Config Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWalk Ġto Ġcorrect Ġclass ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Class Ġ= Ġmixin Config ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpath . last Index Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Class Ġ= Ġ( find Property ( current Class , Ġpath [ i ]) ?. type Ġas ? ĠPsi ClassType )?. resolve () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠReference ( element : ĠJson StringLiteral ) Ġ: ĊĠĠĠĠĠĠĠ ĠPsi Reference Base < Json StringLiteral >( element ), ĊĠĠĠĠĠĠĠ ĠIns pection Reference Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdescription : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" config Ġproperty Ġ'% s '" ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġun resolved : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġresolve () Ġ== Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġresolve Reference ( element ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Variants () Ġ= Ġcollect Variants ( element ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Reference To ( element : ĠPsi Element ) Ġ= Ġelement Ġis ĠPsi Field Ġ&& Ġsuper . is Reference To ( element ) ĊĠĠĠ Ġ} Ċ } Ċ