/* Ċ Ġ* ĠMinecraft ĠDev Ġfor ĠIntelliJ Ċ Ġ* Ċ Ġ* Ġhttps :// minecraft dev . org Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġm inecraft - dev Ċ Ġ* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ*/ Ċ Ċ package Ġcom . de mon wav . mc dev . platform . mixin . util Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Element Factory Ċ import Ġcom . intellij . psi . Psi Type Ċ import Ġcom . intellij . psi . Psi Type Parameter List Ċ import Ġorg . object web . asm . Op codes Ċ import Ġorg . object web . asm . Type Ċ import Ġorg . object web . asm . signature . Signature Visitor Ċ Ċ class ĠSignature To Psi ( ĊĠĠĠ Ġprivate Ġval Ġelement Factory : ĠPsi Element Factory , ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠPsi Element ?, ĊĠĠĠ Ġprivate Ġval Ġtype Completed Callback : Ġ(( Psi Type ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠSignature Visitor ( Op codes . ASM 7 ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtext Ġ= ĠStringBuilder () ĊĊĠĠĠ Ġprivate Ġvar Ġhad Bound Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġhad Type Argument Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġarray Dimensions Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlast Type Argument Visitor : ĠSignature To Psi ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġformal Type Parameters : ĠPsi Type Parameter List ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! text . endsWith (' > ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (' >') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement Factory . createClass FromText (" class ĠFoo $ text Ġ{}", Ġcontext ). type Parameter List !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtype : ĠPsi Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Factory . create Type FromText ( text . toString (), Ġcontext ) ĊĊĠĠĠ Ġvar Ġsuperclass Type : ĠPsi Type ? Ġ= Ġnull ĊĠĠĠ Ġval Ġinterface Types Ġ= Ġmutable ListOf < Psi Type >() ĊĊĠĠĠ Ġval Ġparameter Types Ġ= Ġmutable ListOf < Psi Type >() ĊĠĠĠ Ġvar ĠreturnType : ĠPsi Type ? Ġ= Ġnull ĊĠĠĠ Ġval Ġexception Types Ġ= Ġmutable ListOf < Psi Type >() ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Formal Type Parameter ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ('< ') ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtext . append ( name ) ĊĠĠĠĠĠĠĠ Ġhad Bound Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class Bound (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġtext . append (" Ġextends Ġ") ĊĠĠĠĠĠĠĠ Ġhad Bound Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Interface Bound (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( had Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (" Ġ& Ġ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (" Ġextends Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhad Bound Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Super class (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSignature To Psi ( element Factory , Ġcontext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuperclass Type Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Interface (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSignature To Psi ( element Factory , Ġcontext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface Types Ġ+= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ParameterType (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSignature To Psi ( element Factory , Ġcontext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Types Ġ+= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ReturnType (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSignature To Psi ( element Factory , Ġcontext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Exception Type (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSignature To Psi ( element Factory , Ġcontext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Types Ġ+= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Type Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( array Dimensions Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (" [] ". repeat ( array Dimensions )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Dimensions Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtype Completed Callback ?. let Ġ{ Ġit ( this . type ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit BaseType ( descriptor : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtext . append ( Type . getType ( descriptor . toString ()). className ) ĊĠĠĠĠĠĠĠ Ġon Type Completed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Variable ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtext . append ( name ) ĊĠĠĠĠĠĠĠ Ġon Type Completed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ArrayType (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġarray Dimensions ++ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ClassType ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtext . append ( name . replace ('/', Ġ'. '). replace ('$ ', Ġ'. ')) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Last Type Argument () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Visitor Ġ= Ġlast Type Argument Visitor ĊĠĠĠĠĠĠĠ Ġif Ġ( last Visitor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ( last Visitor . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Type Argument Visitor Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Argument () Ġ{ ĊĠĠĠĠĠĠĠ Ġappend Last Type Argument () ĊĠĠĠĠĠĠĠ Ġif Ġ( had Type Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ('< ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhad Type Argument Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtext . append (" ?") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Argument ( wildcard : ĠChar ): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġappend Last Type Argument () ĊĠĠĠĠĠĠĠ Ġif Ġ( had Type Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ('< ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhad Type Argument Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( wildcard Ġ== ĠEXT END S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (" ? Ġextends Ġ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( wildcard Ġ== ĠSUP ER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (" ? Ġsuper Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvisitor Ġ= ĠSignature To Psi ( element Factory , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġlast Type Argument Visitor Ġ= Ġvisitor ĊĠĠĠĠĠĠĠ Ġreturn Ġvisitor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Inner ClassType ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġappend Last Type Argument () ĊĠĠĠĠĠĠĠ Ġif Ġ( had Type Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (' >') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhad Type Argument Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtext . append ('. '). append ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End () Ġ{ ĊĠĠĠĠĠĠĠ Ġappend Last Type Argument () ĊĠĠĠĠĠĠĠ Ġif Ġ( had Type Argument ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append (' >') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Type Completed () ĊĠĠĠ Ġ} Ċ } Ċ