/* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠJ os Ã© ĠRo berto Ġde ĠA ra Ãº jo ĠJ Ãºn ior Ċ Ġ* Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Equals Or HashCode ") Ċ Ċ package Ġorg . plate stack . bukkit . scanner . structure Ċ Ċ import Ġjava . util .* Ċ Ċ interface ĠIdentifier Ċ Ċ /** Ċ Ġ* ĠA Ġfield Ġname Ċ Ġ*/ Ċ data Ġclass ĠField Identifier ( val Ġname : ĠString ): ĠIdentifier , ĠComparable < Field Identifier > Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġname ĊĊĠĠĠ Ġfun Ġto Change () Ġ= ĠField Change ( Name ( name )) ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠField Identifier ) Ġ= Ġname . compareTo ( other . name ) Ċ } Ċ Ċ private Ġval Ġvalid Method Ġ= ĠRegex (""" ^\ (( \) V | (\ [* ([ BCD FI JS Z ]| L [^ ; ]+ ; )) *\ )( V |\ [* ([ BCD FI JS Z ]| L [^ ; ]+ ; ))) $ """) Ċ Ċ /** Ċ Ġ* ĠA Ġmethod Ġname Ġand Ġits Ġdescriptor Ċ Ġ*/ Ċ data Ġclass ĠMethod Identifier ( val Ġname : ĠString , Ġval Ġdescriptor : ĠString ): ĠIdentifier , ĠComparable < Method Identifier > Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ name Ġ$ descriptor " ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( valid Method . matches ( descriptor )) Ġ{ Ġ" Invalid Ġmethod Ġdescriptor Ġfor Ġ$ name : Ġ$ descriptor " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Change ( class Supplier : Ġ( Class Identifier ) Ġ-> ĠClass Change Ġ= Ġ{ Ġit . to Change () Ġ}) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Change ( Name ( name ), ĠMethod Descriptor ( descriptor , Ġclass Supplier )) ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠMethod Identifier ) Ġ= ĠtoString (). compareTo ( other . toString ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġdis as semb led Ġpackage Ġname Ċ Ġ* Ġ@ property Ġparent ĠThe Ġparent Ġpackage Ġwhich Ġthis Ġpackage Ġres ides Ċ Ġ* Ġ@ property Ġname ĠThis Ġpackage Ġname , Ġwithout Ġany Ġseparator Ġcharacter Ċ Ġ* Ġ@ property ĠfullName ĠName Ġincluding Ġthe Ġparent 's Ġname Ġand Ġ'/' Ġsepar ators . Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġstring Ġis Ġsimilar Ġto Ġclass Ġnames , Ġit Ġdoes Ġ** not ** Ġends Ġwith Ġ'/' Ċ Ġ* Ċ Ġ* Ġ@ property Ġprefix ĠThe Ġsame Ġas Ġ[ fullName ] Ġbut Ġwith Ġa Ġtrailing Ġ'/' Ċ Ġ*/ Ċ data Ġclass ĠPackage Identifier Ġconstructor ( val Ġparent : ĠPackage Identifier ?, Ġval Ġname : ĠString ): ĠIdentifier , ĠComparable < Package Identifier > Ġ{ ĊĠĠĠ Ġconstructor ( parent Name : ĠString , Ġname : ĠString ): Ġthis ( if ( parent Name . isBlank ()) Ġnull Ġelse ĠPackage Identifier ( parent Name ), Ġname ) ĊĠĠĠ Ġconstructor ( fullName : ĠString ): Ġthis ( fullName . substring Before Last ('/', Ġ""), ĠfullName . substring After Last ('/ ')) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( name . isNotBlank () Ġ|| Ġparent Ġ== Ġnull ) Ġ{ Ġ" Package Ġname Ġis Ġblank Ġbut Ġhas Ġa Ġparent !" Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ('/ ' Ġ! in Ġname ) Ġ{ Ġ" Package Ġcan 't Ġcontains Ġ'/ '" Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ('. ' Ġ! in Ġname ) Ġ{ Ġ" Package Ġcan 't Ġcontains Ġ'.' " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠfullName Ġ= Ġif ( parent Ġ!= Ġnull ) Ġ"$ parent $ name " Ġelse Ġname ĊĠĠĠ Ġval Ġprefix Ġ= Ġif ( name . isBlank ()) Ġ"" Ġelse Ġ"$ fullName /" ĊĊĠĠĠ Ġfun Ġto Change ( parent Supplier : Ġ( Package Identifier ) Ġ-> ĠPackage Change ? Ġ= Ġ{ null }): ĠPackage Change Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Change Ġ= Ġparent ?. let Ġ{ Ġparent Supplier ( it ) Ġ?: Ġit . to Change ( parent Supplier ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPackage Change ( parent Change , Ġparent Change , ĠPackage Name ( name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCache s Ġthe Ġhash Ġcode Ġas Ġthis Ġclass Ġis Ġimmutable Ġand Ġkind a Ġcomplex ĊĠĠĠ Ġprivate Ġval ĠhashCode Ġby Ġlazy Ġ{ ĠObjects . hash ( parent , Ġname ) Ġ} ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= ĠhashCode ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġprefix ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠPackage Identifier ) Ġ= Ġprefix . compareTo ( other . prefix ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġdis as semb led Ġclass Ġname . ĠComposite Ġclass Ġnames Ġare Ġdis as semb led Ġby Ġthe Ġ'$ ' Ġcharacter . Ċ Ġ* Ċ Ġ* ĠFull Ġname ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠPackage ĠĠĠĠ Ġ| ĠParent ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠClass Ġname ĠĠĠĠ Ġ| ĠNotes Ċ Ġ* Ġ---------------- ----- Ġ| Ġ----------- Ġ| Ġ------------------- Ġ| Ġ-------------- Ġ| Ġ------------- Ċ Ġ* Ġcom / example / Cool Class Ġ| Ġcom . example Ġ| Ġnull ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠCool Class ĠĠĠĠĠ Ġ| ĠNormal Ġclass Ċ Ġ* ĠNo Package Class ĠĠĠĠĠĠĠ Ġ| Ġ( empty ) ĠĠĠĠ Ġ| Ġnull ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠNo Package Class Ġ| ĠPackage Ġis Ġ` Package Identifier ( null , Ġ"") ` Ċ Ġ* Ġa / Nested $ Class ĠĠĠĠĠĠĠ Ġ| Ġa ĠĠĠĠĠĠĠĠĠĠ Ġ| Ġa / Nested ĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ$ Class ĠĠĠĠĠĠĠĠ Ġ| ĠThe Ġparent Ġret ains Ġthe Ġpackage , Ġthe Ġnested Ġclass Ġname Ġret ains Ġthe Ġ'$ ' Ġsymbol Ċ Ġ* Ġa / Class $ with $ lambda $ 3 Ġ| Ġa ĠĠĠĠĠĠĠĠĠĠ Ġ| Ġa / Class $ with $ lambda Ġ| Ġ$ 3 ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠThe Ġparent Ġclass Ġmay Ġbe Ġfake Ġand Ġdoesn 't Ġexists , Ġbut Ġit Ġis Ġstill Ġa Ġparent Ġclass Ċ Ġ* Ġa / Class $ with $ lambda ĠĠ Ġ| Ġa ĠĠĠĠĠĠĠĠĠĠ Ġ| Ġa / Class $ with ĠĠĠĠĠĠĠ Ġ| Ġ$ lambda ĠĠĠĠĠĠĠ Ġ| ĠThe Ġparent Ġclass Ġalso Ġret ains Ġit 's Ġparent Ġclasses Ċ Ġ* Ġa / Class $ with ĠĠĠĠĠĠĠĠĠ Ġ| Ġa ĠĠĠĠĠĠĠĠĠĠ Ġ| Ġa / Class ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ$ with ĠĠĠĠĠĠĠĠĠ Ġ| ĠUp Ġto Ġwe Ġreach Ġa Ġnormal Ġclass Ċ Ġ* Ġscala / Nothing $ ĠĠĠĠĠĠĠ Ġ| Ġscala ĠĠĠĠĠĠ Ġ| Ġscala / Nothing ĠĠĠĠĠĠ Ġ| Ġ$ ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠTr ailing Ġ'$ ' Ġdoes Ġnot Ġcreates Ġempty Ġclass Ġname , Ġit Ġis Ġprocessed Ġlike Ġall Ġother Ġnested Ġclasses . Ċ Ġ* Ġsc ary /$ Scala $$ $ name ĠĠ Ġ| Ġsc ary ĠĠĠĠĠĠ Ġ| Ġsc ary /$ Scala $$ ĠĠĠĠĠ Ġ| Ġ$ name ĠĠĠĠĠĠĠĠĠ Ġ| ĠThe Ġname Ġret ains Ġits Ġ'$ ' Ċ Ġ* Ġsc ary /$ Scala $$ ĠĠĠĠĠĠĠ Ġ| Ġsc ary ĠĠĠĠĠĠ Ġ| Ġsc ary /$ Scala $ ĠĠĠĠĠĠ Ġ| Ġ$ ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠEvery Ġ'$ ' Ġis Ġprocessed Ġindividually Ċ Ġ* Ġsc ary /$ Scala $ ĠĠĠĠĠĠĠĠ Ġ| Ġsc ary ĠĠĠĠĠĠ Ġ| Ġsc ary /$ Scala ĠĠĠĠĠĠĠ Ġ| Ġ$ ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠClass Ġnames Ġcan 't Ġbe Ġempty ! Ċ Ġ* Ġsc ary /$ Scala ĠĠĠĠĠĠĠĠĠ Ġ| Ġsc ary ĠĠĠĠĠĠ Ġ| Ġnull ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ$ Scala ĠĠĠĠĠĠĠĠ Ġ| ĠSo Ġit Ġhas Ġno Ġnormal Ġparent Ġclass Ġin Ġthe Ġend Ċ Ġ* Ċ Ġ* Ġ@ property Ġpackage ĠThe Ġpackage Ġwhich Ġthis Ġclass Ġres ides Ċ Ġ* Ġ@ property Ġparent ĠThe Ġclass Ġwhich Ġn ests Ġthis Ġclass Ġor Ġis Ġreferred Ġby Ġthis Ġclass Ġname Ġbefore Ġthe Ġactual Ġname . ĠThe Ġparent Ġmust Ġhave Ġthe Ġsame Ġpackage Ġas Ġthis Ġclass . Ċ Ġ* Ġ@ property ĠclassName ĠThe Ġactual Ġname Ġof Ġthis Ġclass . ĠMust Ġcontains Ġthe Ġseparation Ġcharacter . Ċ Ġ* Ġ@ property Ġfull Simple Name ĠThe Ġcombination Ġof Ġthe Ġparent 's Ġname Ġwith Ġthis Ġname , Ġexcluding Ġthe Ġpackage Ġname Ċ Ġ* Ġ@ property ĠfullName ĠThe Ġfull Ġname Ġincluding Ġthe Ġpackage Ġand Ġthe Ġparent Ġname . Ċ Ġ*/ Ċ data Ġclass ĠClass Identifier ( val Ġ` package `: ĠPackage Identifier , Ġval Ġparent : ĠClass Identifier ?, Ġval ĠclassName : ĠString ): ĠIdentifier , ĠComparable < Class Identifier > Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( className . isNotBlank ()) Ġ{ Ġ" The Ġclass Ġname Ġcan 't Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ('. ' Ġ! in ĠclassName ) Ġ{ Ġ" Class Ġname Ġcan 't Ġcontains Ġ'.' " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ('/ ' Ġ! in ĠclassName ) Ġ{ Ġ" Class Ġname Ġcan 't Ġcontains Ġ'/ '" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( parent Ġ== Ġnull Ġ|| Ġparent .` package ` Ġ== Ġ` package `) Ġ{ Ġ" The Ġparent Ġclass Ġhas Ġa Ġdifferent Ġpackage Ġthan Ġthis ! ĠThis : Ġ$ this Ġ; ĠParent : Ġ$ parent " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfull Simple Name : String Ġ= Ġ( parent ?. full Simple Name Ġ?: Ġ"") Ġ+ ĠclassName ĊĠĠĠ Ġval ĠfullName : ĠString Ġ= Ġ` package `. prefix Ġ+ Ġfull Simple Name ĊĊĠĠĠ Ġfun Ġto Change ( package Provider : Ġ( Package Identifier ) Ġ-> ĠPackage Move Ġ= Ġ{ ĠPackage Move ( it . to Change ()) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Provider : Ġ( Class Identifier ) Ġ-> ĠClass Change ? Ġ= Ġ{ Ġnull Ġ} ĊĠĠĠ Ġ): ĠClass Change Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠClass Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Provider (` package `). let Ġ{ ĠPackage Move ( it . old , Ġit . new ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. let Ġ{ Ġparent Provider ( it ) Ġ?: Ġit . to Change ( package Provider , Ġparent Provider ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name ( className ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Name (" create ") Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke (` package `: ĠPackage Identifier , Ġcomposite Name : ĠString ): ĠClass Identifier Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( composite Name . isNotBlank ()) Ġ{ Ġ" The Ġcomposite Ġname Ġcan 't Ġbe Ġempty " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparent : ĠClass Identifier ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġcomposite Name . split ('$ '). map Indexed To ( Array Deque ()) Ġ{ Ġindex , Ġpart Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( index Ġ== Ġ 0 ) Ġpart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ'$ '+ part ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( parts . peek (). isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . remove () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġparts . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= ĠClass Identifier (` package `, Ġparent , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠcheckNotNull ( parent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Name (" create ") Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( fullName : ĠString ): ĠClass Identifier Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( fullName . isNotBlank ()) Ġ{ Ġ" The Ġfull Ġname Ġcan 't Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( fullName . last () Ġ!= Ġ'/') Ġ{ Ġ" The Ġfull Ġname Ġcan 't Ġends Ġwith Ġ'/ '" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠfullName . lastIndexOf ('/') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpack : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpack Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠfullName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpack Ġ= ĠfullName . substring ( 0 , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠfullName . substring ( index + 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Identifier ( Package Identifier ( pack ), Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCache s Ġthe Ġhash Ġcode Ġas Ġthis Ġclass Ġis Ġimmutable Ġand Ġkind a Ġcomplex ĊĠĠĠ Ġprivate Ġval ĠhashCode Ġby Ġlazy Ġ{ ĠObjects . hash (` package `, Ġparent , ĠclassName ) Ġ} ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= ĠhashCode ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĠfullName ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠClass Identifier ) Ġ= ĠfullName . compareTo ( other . fullName ) Ċ } Ċ