/* Ċ Ġ* ĠModule Name . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 1 , ĠThe ĠAv ail ĠFoundation , ĠLLC . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* ĠĠ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ* ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġthe Ġcontributors Ċ Ġ* ĠĠ Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ċ Ġ* ĠĠ Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġcom . avail . builder Ċ Ċ import Ġcom . avail . descriptor . module . Module Descriptor Ċ Ċ /** Ċ Ġ* ĠA Ġ` ModuleName ` Ġrepresents Ġthe Ġcanonical Ġname Ġof Ġan ĠAv ail Ċ Ġ* Ġ[ module ][ Module Descriptor ]. ĠA Ġcanonical Ġname Ġis Ġspecified Ġrelative Ġto Ġan Ċ Ġ* ĠAv ail Ġ[ module &# 3 2 ; root ][ Module Roots ] Ġand Ġhas Ġthe Ġform Ġ** R / X / Y / Z **, Ġwhere Ċ Ġ* Ġ** R ** Ġis Ġa Ġmodule Ġroot Ġon Ġthe ĠAv ail Ġmodule Ġpath , Ġ** X ** Ġis Ġa Ġpackage Ġwithin Ċ Ġ* Ġ** R **, Ġ** Y ** Ġis Ġa Ġpackage Ġwithin Ġ** X **, Ġand Ġ** Z ** Ġis Ġa Ġmodule Ġor Ġpackage Ċ Ġ* Ġwithin Ġ** Y **. Ċ Ġ* Ċ Ġ* Ġ@ property Ġqualified Name Ċ Ġ* ĠĠ ĠThe Ġfully - qualified Ġmodule Ġname . Ċ Ġ* Ġ@ property Ġis Rename Ċ Ġ* ĠĠ Ġ` true ` Ġiff Ġthis Ġmodule Ġname Ġwas Ġtransformed Ġvia Ġa Ġrename Ġrule . Ċ Ġ* Ġ@ author ĠT odd ĠL ĠSmith Ġ& lt ; tod d @ avail lang . org Ġ& gt ; Ċ Ġ* Ċ Ġ* Ġ@ constructor Ċ Ġ* Ċ Ġ* ĠConstruct Ġa Ġnew Ġ` ModuleName ` Ġfrom Ġthe Ġspecified Ġfully - qualified Ġmodule Ġname . Ċ Ġ* Ċ Ġ* Ġ@ param Ġqualified Name Ċ Ġ* ĠĠ ĠA Ġfully - qualified Ġmodule Ġname . Ċ Ġ* Ġ@ param Ġis Rename Ċ Ġ* ĠĠ ĠWhether Ġmodule Ġresolution Ġfollowed Ġa Ġrenaming Ġrule . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ċ Ġ* ĠĠ ĠIf Ġthe Ġargument Ġwas Ġmalformed . Ċ Ġ*/ Ċ open Ġclass ĠModule Name Ċ @ Throws ( IllegalArgumentException :: class ) Ċ constructor ( Ċ ĉ val Ġqualified Name : ĠString , Ċ ĉ val Ġis Rename : ĠBoolean Ġ= Ġfalse ) Ċ { Ċ ĉ /** ĠThe Ġlogical Ġroot Ġname Ġof Ġthe Ġ` ModuleName `. Ġ*/ Ċ ĉ val Ġroot Name : ĠString ĊĊ ĉ /** ĠThe Ġfully - qualified Ġpackage Ġname Ġof Ġthe Ġ` ModuleName `. Ġ*/ Ċ ĉ val ĠpackageName : ĠString ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġlocal Ġname Ġof Ġthe Ġ[ module ][ Module Descriptor ] Ġreferenced Ġby Ġthis Ċĉ Ġ* Ġ` ModuleName `. Ċĉ Ġ*/ Ċ ĉ val Ġlocal Name : ĠString ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġl az ily - initialized Ġroot - relative Ġ` ModuleName `. ĠThis Ġis Ġthe Ċĉ Ġ* Ġ[ fully - qualified ][ qualified Name ] Ġname Ġminus Ġthe Ġ[ root Name ]. Ċĉ Ġ*/ Ċ ĉ val Ġroot Relative Name : ĠString Ġby Ġlazy Ġ{ Ġqualified Name . substring After ("/") Ġ} ĊĊ ĉ init Ċ ĉ { Ċĉ ĉ val Ġcomponents Ġ= Ġqualified Name . split ("/") Ċĉ ĉ require ( components . size Ġ>= Ġ 3 Ġ&& Ġcomponents [ 0 ]. isEmpty ()) Ġ{ Ċĉĉ ĉ " invalid Ġfully - qualified Ġmodule Ġname Ġ($ qualified Name )" Ċĉ ĉ } ĊĊĉ ĉ // ĠHandle Ġthe Ġeasy Ġones Ġfirst . Ċĉ ĉ this . root Name Ġ= Ġcomponents [ 1 ] Ċĉ ĉ this . local Name Ġ= Ġcomponents [ components . size Ġ- Ġ 1 ] ĊĊĉ ĉ // ĠNow Ġdetermine Ġthe Ġpackage . Ċĉ ĉ val Ġbuilder Ġ= ĠStringBuilder ( 5 0 ) Ċĉ ĉ for Ġ( index Ġin Ġ 1 Ġuntil Ġcomponents . size Ġ- Ġ 1 ) Ċĉ ĉ { Ċĉĉ ĉ builder . append ("/") Ċĉĉ ĉ builder . append ( components [ index ]) Ċĉ ĉ } Ċĉ ĉ this . packageName Ġ= Ġbuilder . toString () Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠConstruct Ġa Ġnew Ġ` ModuleName ` Ġfrom Ġthe Ġspecified Ġcanonical Ġmodule Ġgroup Ċĉ Ġ* Ġname Ġand Ġlocal Ġname . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param ĠpackageName Ċĉ Ġ* ĠĠ ĠA Ġcanonical Ġpackage Ġname . Ċĉ Ġ* Ġ@ param Ġlocal Name Ċĉ Ġ* ĠĠ ĠA Ġlocal Ġmodule Ġname . Ċĉ Ġ* Ġ@ param Ġis Rename Ċĉ Ġ* ĠĠ ĠWhether Ġmodule Ġresolution Ġfollowed Ġa Ġrenaming Ġrule . Ċĉ Ġ* Ġ@ throws ĠIllegalArgumentException Ċĉ Ġ* ĠĠ ĠIf Ġthe Ġargument Ġwas Ġmalformed . Ċĉ Ġ*/ Ċ ĉ @ Throws ( IllegalArgumentException :: class ) Ġ@ Jvm Over loads Ġconstructor ( Ċĉ ĉ packageName : ĠString , Ċĉ ĉ local Name : ĠString , Ċĉ ĉ is Rename : ĠBoolean Ġ= Ġfalse ) Ġ: Ġthis ("$ packageName /$ local Name ", Ġis Rename ) ĊĊ ĉ override Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ċ ĉ { Ċĉ ĉ return Ġthis Ġ=== Ġother Ġ|| Ċĉĉ ĉ other Ġis ĠModule Name Ġ&& Ġqualified Name Ġ== Ġother . qualified Name Ċ ĉ } ĊĊ ĉ override Ġfun ĠhashCode () Ġ= Ċĉ ĉ // ĠThe Ġmagic Ġnumber Ġis Ġa Ġprime . Ċĉĉ 3 4 5 5 3 3 Ġ* Ġqualified Name . hashCode () Ġxor Ġ 0 x 5 8 8 1 2 7 1 A ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġqualified Name Ċ } Ċ