package Ġmodel Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonIgnore Ċ import Ġcom . github . jav ap ar ser . Position Ċ import Ġcom . github . jav ap ar ser . Range Ċ import Ġcom . github . jav ap ar ser . ast . Node Ċ import Ġutility .* ĊĊ Ċ data Ġclass ĠUnit ( ĊĠĠĠ Ġ@ JsonIgnore Ġval Ġnode : ĠNode ? Ġ= Ġnull , ĊĠĠĠ Ġ@ JsonIgnore Ġval Ġnode Sequence : ĠList < Node >? Ġ= Ġnull , ĊĠĠĠ Ġ@ JsonIgnore Ġval Ġcontent Raw : ĠString , ĊĠĠĠ Ġval Ġcontent : ĠString , ĊĠĠĠ Ġval Ġrange : ĠRange , ĊĠĠĠ Ġval Ġidentifier : ĠString , ĊĠĠĠ Ġval Ġhash : ĠInt , ĊĠĠĠ Ġval Ġmass : ĠInt , ĊĠĠĠ Ġval Ġs loc : ĠInt , ĊĠĠĠ Ġvar Ġid : ĠInt ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠhashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains ( clone : ĠUnit ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ== Ġclone ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . identifier Ġ!= Ġclone . identifier Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . range . contains ( clone . range ) ĠĠĠ Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠUnit ĊĊĠĠĠĠĠĠĠ Ġif Ġ( content Ġ!= Ġother . content ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( range Ġ!= Ġother . range ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( identifier Ġ!= Ġother . identifier ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠInt Ġ= Ġcontent . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġrange . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġidentifier . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Unit ( id ='$ id ', Ġcontent ='$ content ', Ġrange =$ range , Ġidentifier =$ identifier )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ CL ON ET YPE Ġ= ĠClone Type . ONE ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom Node ( node : ĠNode , ĠbasePath : ĠString , Ġclone Type : ĠClone Type Ġ= ĠDEFAULT _ CL ON ET YPE ): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent : ĠString Ġ= Ġnode . token Range . get (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUnit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Raw Ġ= Ġnode . token Range . get (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcontent . filter Out Blank Lines And Java Comments (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange Ġ= Ġnode . range . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier Ġ= Ġnode . retrieve Location (). convertTo Package Identifier ( basePath ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= Ġnode . len ient HashCode ( clone Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmass Ġ= Ġnode . calculate Mass (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs loc Ġ= Ġcontent . count Java S loc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom Node Sequence ( node Sequence : ĠList < Node >, ĠbasePath : ĠString , Ġclone Type : ĠClone Type Ġ= ĠDEFAULT _ CL ON ET YPE ): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent : ĠString Ġ= Ġcalculate Node Sequence Content ( node Sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUnit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Sequence Ġ= Ġnode Sequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Raw Ġ= Ġcalculate Node Sequence Content ( node Sequence ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcontent . filter Out Blank Lines And Java Comments (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange Ġ= Ġcalculate Node Sequence Range ( node Sequence ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier Ġ= Ġnode Sequence . first (). retrieve Location (). convertTo Package Identifier ( basePath ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= Ġnode Sequence . map Ġ{ Ġit . len ient HashCode ( clone Type ) Ġ}. hashCode (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmass Ġ= Ġnode Sequence . sum By Ġ{ Ġit . calculate Mass () Ġ} Ġ+ Ġnode Sequence . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs loc Ġ= Ġcontent . count Java S loc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalculate Node Sequence Content ( node Sequence : ĠList < Node >): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠString Ġ= Ġnode Sequence [ 0 ]. token Range . get (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i : ĠInt Ġin Ġ( 1 Ġuntil Ġnode Sequence . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Sequence [ i Ġ- Ġ 1 ]. range . get (). end . line Ġ== Ġnode Sequence [ i ]. range . get (). begin . line ) Ġresult Ġ+= Ġ" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k : ĠInt Ġin Ġ( node Sequence [ i Ġ- Ġ 1 ]. range . get (). end . line Ġ+ Ġ 1 Ġuntil Ġnode Sequence [ i ]. range . get (). begin . line )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ" Ġ\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġnode Sequence [ i ]. token Range . get (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalculate Node Sequence Range ( node Sequence : ĠList < Node >): ĠRange Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Position Ġ= Ġnode Sequence [ 0 ]. range . get (). begin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Position Ġ= Ġnode Sequence [ node Sequence . size Ġ- Ġ 1 ]. range . get (). end ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRange ( Position . pos ( initial Position . line , Ġinitial Position . column ), ĠPosition . pos ( final Position . line , Ġfinal Position . column )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ