/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand Ġother Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġcom . jetbrains . plugin verifier . analysis Ċ Ċ import Ġcom . jetbrains . plugin . structure . classes . resolvers . Resolution Result Ċ import Ġcom . jetbrains . plugin . structure . classes . resolvers . Resolver Ċ import Ġcom . jetbrains . plugin . structure . classes . utils . Asm Util Ċ import Ġcom . jetbrains . plugin . structure . intellij . plugin . Ide Plugin Ċ import Ġcom . jetbrains . plugin . structure . intellij . plugin . Plugin Xml Util Ċ import Ġcom . jetbrains . plugin verifier . dependencies . Dependencies Graph Ċ import Ġorg . object web . asm .* Ċ import Ġjava . util .* Ċ Ċ private Ġtype alias ĠClass Name Ġ= ĠString Ċ Ċ class ĠType Graph Ġ{ ĊĊĠ Ġprivate Ġval Ġback Type Edges : ĠMutable Map < ClassName , ĠMutable Set < ClassName >> Ġ= Ġhash Map Of () ĊĊĠ Ġfun Ġadd Edge ( from : ĠClass Name , Ġto : ĠClass Name ) Ġ{ ĊĠĠĠ Ġback Type Edges . get Or Put ( to ) Ġ{ Ġhash Set Of () Ġ} Ġ+= Ġfrom ĊĠ Ġ} ĊĊĠ Ġfun Ġget Edges To ( to : ĠClass Name ): ĠSet < ClassName > Ġ= ĊĠĠĠ Ġback Type Edges [ to ]. or Empty () Ċ } Ċ Ċ class ĠRe ach ability Graph ( private Ġval Ġgraph : ĠType Graph ) Ġ{ ĊĊĠ Ġenum Ġclass ĠRe ach ability Mark Ġ{ ĊĠĠĠ ĠMAIN _ PLUGIN , ĊĠĠĠ ĠOPTIONAL _ PLUGIN ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġclass Marks : ĠMutable Map < ClassName , ĠEnum Set < Reach ability Mark >> Ġ= Ġhash Map Of () ĊĊĠ Ġfun Ġmark Class ( className : ĠClass Name , Ġmark : ĠRe ach ability Mark ) Ġ{ ĊĠĠĠ Ġclass Marks . get Or Put ( className ) Ġ{ ĠEnum Set . none Of ( Reach ability Mark :: class . java ) Ġ} Ġ+= Ġmark ĊĠ Ġ} ĊĊĠ Ġfun Ġis Class Reach able From Mark ( className : ĠClass Name , Ġmark : ĠRe ach ability Mark ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġvisited Classes Ġ= Ġhash Set Of < ClassName >() ĊĠĠĠ Ġval Ġstack Ġ= ĠLinkedList < ClassName >() ĊĠĠĠ Ġval Ġway Ġ= ĠLinkedList < ClassName >() ĊĊĠĠĠ Ġstack Ġ+= ĠclassName ĊĠĠĠ Ġwhile Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġcurrent Class Ġ= Ġstack . peek First () ĊĠĠĠĠĠ Ġif Ġ(! visited Classes . add ( current Class )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Second Ġtime Ġvisit ing Ġthe Ġsame Ġnode Ġ=> Ġall Ġnode 's Ġchildren Ġare Ġvisited Ġ=> Ġpoll Ġfrom Ġthe Ġqueue . ĊĠĠĠĠĠĠĠ Ġstack . poll First () ĊĠĠĠĠĠĠĠ Ġway . poll Last () ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġway . add Last ( current Class ) ĊĊĠĠĠĠĠ Ġval Ġreferencing Types Ġ= Ġgraph . get Edges To ( current Class ) ĊĠĠĠĠĠ Ġfor Ġ( typeName Ġin Ġreferencing Types ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( class Marks [ typeName ]?. contains ( mark ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Mark Ġall Ġthe Ġclasses Ġon Ġthe Ġway Ġas Ġmemo ization . ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( name Ġin Ġway ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Class ( name , Ġmark ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( typeName Ġ! in Ġvisited Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġstack . add First ( typeName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} Ċ } ĊĊ Ċ fun Ġbuild Class Reach ability Graph ( ĊĠ Ġide Plugin : ĠIde Plugin , ĊĠ Ġplugin Resolver : ĠResolver , ĊĠ Ġdependencies Graph : ĠDependencies Graph Ċ ): ĠRe ach ability Graph Ġ{ ĊĠ Ġval Ġtype Graph Ġ= Ġbuild Type Graph ( plugin Resolver ) ĊĠ Ġval Ġreach ability Graph Ġ= ĠRe ach ability Graph ( type Graph ) ĊĊĠ Ġval Ġmain Classes Ġ= ĠPlugin Xml Util . getAll Classes Referenced From Xml ( ide Plugin ) ĊĠ Ġfor Ġ( className Ġin Ġmain Classes ) Ġ{ ĊĠĠĠ Ġreach ability Graph . mark Class ( className , ĠRe ach ability Graph . Reach ability Mark . MAIN _ PLUGIN ) ĊĠ Ġ} ĊĊĠ Ġval Ġmissing Optional Dependencies Ġ= Ġdependencies Graph . get Direct Missing Dependencies (). filter Ġ{ Ġit . dependency . is Optional Ġ} ĊĠ Ġfor Ġ( missing Optional Dependency Ġin Ġmissing Optional Dependencies ) Ġ{ ĊĠĠĠ Ġval Ġoptional Plugin Ġ= Ġide Plugin . optional Descriptors . find Ġ{ Ġit . dependency Ġ== Ġmissing Optional Dependency . dependency Ġ} ?. optional Plugin ĊĠĠĠ Ġif Ġ( optional Plugin Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġoptional Classes Ġ= ĠPlugin Xml Util . getAll Classes Referenced From Xml ( optional Plugin ) ĊĠĠĠĠĠ Ġfor Ġ( className Ġin Ġoptional Classes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreach ability Graph . mark Class ( className , ĠRe ach ability Graph . Reach ability Mark . OPTIONAL _ PLUGIN ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġreturn Ġreach ability Graph Ċ } Ċ Ċ private Ġfun Ġbuild Type Graph ( plugin Resolver : ĠResolver ): ĠType Graph Ġ{ ĊĠ Ġval Ġgraph Ġ= ĠType Graph () ĊĊĠ Ġplugin Resolver . process All Classes Ġ{ Ġresolution Result Ġ-> ĊĠĠĠ Ġif Ġ( resolution Result Ġ! is ĠResolution Result . Found ) Ġ{ ĊĠĠĠĠĠ Ġreturn @ process All Classes Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġclass Node Ġ= Ġresolution Result . value ĊĊĠĠĠ Ġval Ġreferences Ġ= ĠType References () ĊĠĠĠ Ġclass Node . accept ( Type References Class Visitor ( references )) ĊĠĠĠ Ġval Ġtype References Ġ= Ġreferences . type References ĊĠĠĠ Ġfor Ġ( type Reference Ġin Ġtype References ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( plugin Resolver . contains Class ( type Reference )) Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph . add Edge ( class Node . name , Ġtype Reference ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġtrue ĊĠ Ġ} ĊĊĠ Ġreturn Ġgraph Ċ } Ċ Ċ private Ġclass ĠType References Ġ{ ĊĊĠ Ġval Ġtype References Ġ= Ġhash Set Of < ClassName >() ĊĊĠ Ġfun Ġadd References ( type : ĠType ) Ġ{ ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠ Ġtype . sort Ġ== ĠType . ARRAY Ġ-> Ġadd References ( type . elementType ) ĊĠĠĠĠĠ Ġtype . sort Ġ== ĠType . OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinternal Name Ġ= Ġtype . internal Name ĊĠĠĠĠĠĠĠ Ġcheck (! internal Name . startsWith (" [" )) ĊĠĠĠĠĠĠĠ Ġtype References Ġ+= Ġinternal Name ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtype . sort Ġ== ĠType . METHOD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġadd References ( type . returnType ) ĊĠĠĠĠĠĠĠ Ġtype . argument Types . forEach Ġ{ Ġadd References ( it ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠType References . add Handle ( handle : ĠHandle ) Ġ{ ĊĠ Ġadd References ( Type . get ObjectType ( handle . owner )) ĊĠ Ġval Ġhandle Type Ġ= ĠType . getType ( handle . desc ) ĊĠ Ġadd References ( handle Type ) Ċ } Ċ Ċ private Ġfun ĠType References . add Constant Dynamic ( constant Dynamic : ĠConstant Dynamic ) Ġ{ ĊĠ Ġadd References ( Type . getType ( constant Dynamic . descriptor )) ĊĠ Ġadd Handle ( constant Dynamic . bootstrap Method ) Ċ } Ċ Ċ private Ġclass ĠType References Class Visitor ( private Ġval Ġreferences : ĠType References ) Ġ: ĠClass Visitor ( Asm Util . ASM _ API _ LEVEL ) Ġ{ ĊĠ Ġoverride Ġfun Ġvisit ( version : ĠInt , Ġaccess : ĠInt , Ġname : ĠString ?, Ġsignature : ĠString ?, Ġsuper Name : ĠString ?, Ġinterfaces : ĠArray < out ĠString > ?) Ġ{ ĊĠĠĠ Ġif Ġ( super Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreferences . add References ( Type . get ObjectType ( super Name )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġinterfaces ?. forEach Ġ{ Ġreferences . add References ( Type . get ObjectType ( it )) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Method ( access : ĠInt , Ġname : ĠString ?, Ġdescriptor : ĠString , Ġsignature : ĠString ?, Ġexceptions : ĠArray < out ĠString >? ): ĠMethod Visitor Ġ{ ĊĠĠĠ Ġval Ġmethod Type Ġ= ĠType . getMethod Type ( descriptor ) ĊĠĠĠ Ġreferences . add References ( method Type ) ĊĠĠĠ Ġexceptions ?. forEach Ġ{ Ġreferences . add References ( Type . get ObjectType ( it )) Ġ} ĊĠĠĠ Ġreturn ĠType References Method Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Field ( access : ĠInt , Ġname : ĠString ?, Ġdescriptor : ĠString , Ġsignature : ĠString ?, Ġvalue : ĠAny ?): ĠField Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Field Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Inner Class ( name : ĠString , Ġouter Name : ĠString ?, Ġinner Name : ĠString ?, Ġaccess : ĠInt ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( name )) ĊĠĠĠ Ġif Ġ( outer Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreferences . add References ( Type . get ObjectType ( outer Name )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit OuterClass ( owner : ĠString , Ġname : ĠString ?, Ġdescriptor : ĠString ?) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( owner )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Annotation ( descriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Type Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdescriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Nest Host ( nest Host : ĠString ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( nest Host )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Nest Member ( nest Member : ĠString ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( nest Member )) ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠType References Method Visitor ( private Ġval Ġreferences : ĠType References ) Ġ: ĠMethod Visitor ( Asm Util . ASM _ API _ LEVEL ) Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Multi AN ew Array Insn ( descriptor : ĠString , Ġnum Dimensions : ĠInt ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Try Catch Block ( start : ĠLabel ?, Ġend : ĠLabel ?, Ġhandler : ĠLabel ?, Ġtype : ĠString ?) Ġ{ ĊĠĠĠ Ġif Ġ( type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreferences . add References ( Type . get ObjectType ( type )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit L dc Insn ( value : ĠAny ?) Ġ{ ĊĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠ Ġis ĠType Ġ-> Ġreferences . add References ( value ) ĊĠĠĠĠĠ Ġis ĠHandle Ġ-> Ġreferences . add Handle ( value ) ĊĠĠĠĠĠ Ġis ĠConstant Dynamic Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġreferences . add References ( Type . getType ( value . descriptor )) ĊĠĠĠĠĠĠĠ Ġval Ġbootstrap Method Ġ= Ġvalue . bootstrap Method ĊĠĠĠĠĠĠĠ Ġreferences . add Handle ( bootstrap Method ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Type Insn ( opcode : ĠInt , Ġtype : ĠString ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( type )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Annotation Default (): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Annotation ( descriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Type Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdescriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Invoke Dynamic Insn ( name : ĠString ?, Ġdescriptor : ĠString , Ġbootstrap Method Handle : ĠHandle , Ġvar arg Ġbootstrap Method Arguments : ĠAny ) Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= ĠType . getType ( descriptor ) ĊĠĠĠ Ġreferences . add References ( type ) ĊĠĠĠ Ġreferences . add Handle ( bootstrap Method Handle ) ĊĠĠĠ Ġfor Ġ( method Argument Ġin Ġbootstrap Method Arguments ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( method Argument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠType Ġ-> Ġreferences . add References ( method Argument ) ĊĠĠĠĠĠĠĠ Ġis ĠHandle Ġ-> Ġreferences . add Handle ( method Argument ) ĊĠĠĠĠĠĠĠ Ġis ĠConstant Dynamic Ġ-> Ġreferences . add Constant Dynamic ( method Argument ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Try Catch Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdescriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Method Insn ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString ?, Ġdescriptor : ĠString ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( owner )) ĊĠĠĠ Ġreferences . add References ( Type . getMethod Type ( descriptor )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Method Insn ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString ?, Ġdescriptor : ĠString , Ġis Interface : ĠBoolean ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( owner )) ĊĠĠĠ Ġreferences . add References ( Type . getMethod Type ( descriptor )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Insn Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdescriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Parameter Annotation ( parameter : ĠInt , Ġdescriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Local Variable Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġstart : ĠArray < out ĠLabel > ?, Ġend : ĠArray < out ĠLabel > ?, Ġindex : ĠInt Array ?, Ġdescriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Local Variable ( name : ĠString ?, Ġdescriptor : ĠString , Ġsignature : ĠString ?, Ġstart : ĠLabel ?, Ġend : ĠLabel ?, Ġindex : ĠInt ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Field Insn ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString ?, Ġdescriptor : ĠString ) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . get ObjectType ( owner )) ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠType References Field Visitor ( private Ġval Ġreferences : ĠType References ) Ġ: ĠField Visitor ( Asm Util . ASM _ API _ LEVEL ) Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Annotation ( descriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Type Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdescriptor : ĠString , Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠType References Annotation Visitor ( private Ġval Ġreferences : ĠType References ) Ġ: ĠAnnotation Visitor ( Asm Util . ASM _ API _ LEVEL ) Ġ{ ĊĠ Ġoverride Ġfun Ġvisit Annotation ( name : ĠString ?, Ġdescriptor : ĠString ): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Enum ( name : ĠString ?, Ġdescriptor : ĠString , Ġvalue : ĠString ?) Ġ{ ĊĠĠĠ Ġreferences . add References ( Type . getType ( descriptor )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Array ( name : ĠString ?): ĠAnnotation Visitor Ġ{ ĊĠĠĠ Ġreturn ĠType References Annotation Visitor ( references ) ĊĠ Ġ} Ċ }