package Ġnl . h ann ah sten . tex ify idea . lang . magic Ċ Ċ /** Ċ Ġ* ĠA Ġmagic Ġcomment Ġis Ġa Ġspecial Ġcomment Ġthat Ġprovides Ġmeta Ġdata Ġabout Ġthe Ġdocument Ġto Ġthe ĠIDE . Ċ Ġ* Ċ Ġ* ĠThey Ġstore Ġvalues Ġfor Ġeach Ġkey Ġdefined Ġin Ġa Ġmagic Ġcomment . Ċ Ġ* ĠA Ġsingle Ġkey Ġcan Ġhave Ġmultiple Ġvalues : Ġwhen Ġthe Ġsame Ġkey Ġis Ġused Ġmultiple Ġtimes . Ċ Ġ* ĠThe Ġvalues Ġwill Ġbe Ġstored Ġin Ġorder . Ċ Ġ* ĠWhen Ġthe Ġkey Ġhas Ġno Ġvalue Ġ( i . e . Ġthe Ġkey Ġis Ġmentioned Ġstandalone Ġin Ġa Ġcomment Ġwithout Ġan Ġassignment ) Ċ Ġ* Ġthe Ġlist Ġwill Ġbe Ġempty . Ċ Ġ* ĠWhen Ġa Ġkey Ġis Ġnot Ġpresent Ġin Ġthe Ġmagic Ġcomment , Ġthe Ġstore Ġdoes Ġnot Ġcontain Ġthe Ġkey . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġkeys Ġare Ġunique , Ġvalues Ġare Ġnot . Ċ Ġ* Ċ Ġ* Ġ@ param ĠKey Ċ Ġ* ĠĠĠĠĠĠĠĠĠ ĠThe Ġtype Ġof Ġkey Ġto Ġuse . Ċ Ġ* Ġ@ param ĠValue Ċ Ġ* ĠĠĠĠĠĠĠĠĠ ĠThe Ġtype Ġof Ġthe Ġvalues . Ċ Ġ* Ċ Ġ* Ġ@ author ĠH ann ah ĠS che lle ken s Ċ Ġ*/ Ċ abstract Ġclass ĠMagic Comment < Key , ĠValue > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġempty Ġmagic Ġcomment . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< Key , ĠValue > Ġempty (): ĠMagic Comment < Key , ĠValue > Ġ= ĠMutable Magic Comment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġall Ġkeys Ġin Ġthe Ġmagic Ġcomment Ġto Ġtheir Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ Magic Comment ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġkey Value Store : ĠMutable Map < Key , ĠMutable List < Value >> Ġ= ĠHashMap () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġthe Ġkeys Ġin Ġthe Ġkey Ġvalue Ġstore . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġkey Set (): ĠSet < Key > Ġ= Ġkey Value Store . keys . toSet () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġa Ġkey - value Ġpair Ġwith Ġthe Ġgiven Ġkey Ġis Ġpresent Ġin Ġthe Ġmagic Ġcomment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġpresent , Ġ` false ` Ġif Ġabsent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcontains Key ( key : ĠMagic Key < Key >): ĠBoolean Ġ= Ġkey Value Store . containsKey ( key . key ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġvalue Ġof Ġthe Ġfirst Ġkey - value Ġpair Ġwith Ġthe Ġgiven Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġthe Ġfirst Ġkey - value Ġpair , Ġor Ġ` null ` Ġwhen Ġthe Ġkey Ġis Ġabsent , Ġor Ġwhen Ġthere Ġare Ġno Ġvalues ĊĠĠĠĠ Ġ* Ġavailable Ġfor Ġthe Ġgiven Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalue ( key : ĠMagic Key < Key >): ĠValue ? Ġ= Ġkey Value Store [ key . key ]?. first OrNull () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġthe Ġvalues Ġof Ġthe Ġkey - value Ġpairs Ġwith Ġthe Ġgiven Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġlist Ġof Ġall Ġstored Ġvalues Ġfor Ġthe Ġgiven Ġkey Ġ( empty Ġlist Ġif Ġthe Ġkey Ġis Ġregistered Ġwithout Ġa Ġvalue ), ĊĠĠĠĠ Ġ* Ġor Ġ` null ` Ġwhen Ġthe Ġkey Ġis Ġabsent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalues ( key : ĠMagic Key < Key >): ĠList < Value >? Ġ= Ġkey Value Store [ key . key ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġtotal Ġnumber Ġof Ġkeys Ġin Ġthe Ġmagic Ġcomment . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsize () Ġ= Ġkey Value Store . size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCombin es Ġthe Ġkeys Ġand Ġtheir Ġvalues Ġof Ġboth Ġcomments Ġin Ġa Ġnew Ġmagic Ġcomment . ĊĠĠĠĠ Ġ* ĠIf Ġboth Ġcomments Ġshare Ġthe Ġsame Ġvalue Ġfor Ġthe Ġsame Ġkey , Ġthe Ġvalue Ġwill Ġappear Ġmultiple Ġtimes . ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġorder Ġis : Ġvalues Ġfrom Ġ` this ` Ġbefore Ġvalues Ġfrom Ġ` merge With `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġmerge ( merge With : ĠMagic Comment < Key , ĠValue >): ĠMagic Comment < Key , ĠValue > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġthe Ġmagic Ġcomment Ġto Ġthe Ġlines Ġthat Ġthe ĠMagic Comment Ġwould Ġrepresent Ġin Ġa Ġmagic Ġcomment Ġcode Ġblock . ĊĠĠĠĠ Ġ* ĠDoes Ġnot Ġinclude Ġthe Ġmagic Ġcomment Ġprefix Ġand Ġeach Ġline Ġhas Ġno Ġtrailing Ġor Ġleading Ġwhitespace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto Comment String (): ĠList < String > Ġ= ĠArrayList < String >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġkey Value Store . entries . forEach Ġ{ Ġ( key , Ġvalues ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( key . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ("$ key Ġ= Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ containsKey ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġcontains ( key : ĠMagic Key < Key >) Ġ= Ġcontains Key ( key ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġ@ see Ġ[ merge ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġplus ( merge With : ĠMagic Comment < Key , ĠValue >) Ġ= Ġmerge ( merge With ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġkey Value Store . toString () Ċ } Ċ Ċ /** Ċ Ġ* ĠSee Ġ[ Magic Comment ], Ġbut Ġmutable . Ċ Ġ* Ċ Ġ* Ġ@ author ĠH ann ah ĠS che lle ken s Ċ Ġ*/ Ċ open Ġclass ĠMutable Magic Comment < Key , ĠValue > Ġ: ĠMagic Comment < Key , ĠValue >() Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġnew Ġkey - value Ġpair Ġto Ġthe Ġmagic Ġcomment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġkey Ġalready Ġexists , Ġthe Ġvalue Ġwill Ġbe Ġadded Ġto Ġthe Ġpool Ġof Ġvalues Ġfor Ġthe Ġgiven Ġkey . ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġvalue Ġis Ġ` null `, Ġno Ġvalue Ġis Ġadded , Ġbut Ġthe Ġkey Ġis . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Value ( key : ĠMagic Key < Key >, Ġvalue : ĠValue ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġkey Value Store [ key . key ] Ġ?: ĠArrayList () ĊĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġlist . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġkey Value Store [ key . key ] Ġ= Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġkey - value Ġpairs Ġwith Ġthe Ġgiven Ġkey Ġfrom Ġthe Ġcomment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġprevious Ġvalue Ġassociated Ġwith Ġthe Ġkey , Ġor Ġ` null ` Ġif Ġthe Ġkey Ġwas Ġnot Ġpresent Ġin Ġthe Ġmap . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Key ( key : ĠMagic Key < Key >): ĠList < Value >? Ġ= Ġkey Value Store . remove ( key . key ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġkey - value Ġpairs Ġfrom Ġthe Ġmagic Ġcomment . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ= Ġkey Value Store . clear () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ merge ], Ġbut Ġthen Ġmod ifies Ġ` this ` Ġcomment Ġinstead Ġof Ġcreating Ġa Ġnew Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmerge Modify ( merge With : ĠMagic Comment < Key , ĠValue >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmerge With . keySet (). forEach Ġkey Loop @{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmagic Key Ġ= ĠCustom Magic Key ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmerge With . values ( magic Key ) Ġ?: Ġreturn @ key Loop ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Value ( magic Key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġare Ġno Ġvalues , Ġso Ġjust Ġadd Ġthe Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Value ( magic Key , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmerge ( merge With : ĠMagic Comment < Key , ĠValue >): ĠMagic Comment < Key , ĠValue > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMutable Magic Comment < Key , ĠValue >() ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġthis ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġmerge With ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ merge Modify ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( merge With : ĠMagic Comment < Key , ĠValue >) Ġ= Ġmerge Modify ( merge With ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠMutable Magic Comment < *, Ġ* >) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġjava Class . hashCode () ĊĠĠĠ Ġ} Ċ }