package Ġextract ors . visitor s Ċ Ċ import Ġjava . util . ArrayList Ċ import Ġcom . github . jav ap ar ser . ast . Node Ċ import Ġcom . github . jav ap ar ser . ast . comments . Comment Ċ import Ġcom . github . jav ap ar ser . ast . expr . Null Literal Expr Ċ import Ġcom . github . jav ap ar ser . ast . stmt . Statement Ċ import Ġcom . github . jav ap ar ser . ast . type . Class Or Interface Type Ċ import Ġcom . github . jav ap ar ser . ast . visitor . Tree Visitor Ċ import Ġextract ors . common . Common Ċ import Ġextract ors . features . Property Ċ Ċ class ĠLe aves Visitor Ġ: ĠTree Visitor () Ġ{ ĊĠĠĠ Ġval Ġleaves Ġ= ĠArrayList < Node >() ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠComment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġis Leaf Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġis Generic Parent Ġ= Ġis Generic Parent ( node ) ĊĠĠĠĠĠĠĠ Ġif Ġ( has No Children ( node ) Ġ&& Ġis Not Comment ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! node . toString (). isEmpty () Ġ&& Ġ(" null " Ġ!= Ġnode . toString () Ġ|| Ġnode Ġis ĠNull Literal Expr )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaves . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Leaf Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchild Id Ġ= Ġget Child Id ( node ) ĊĠĠĠĠĠĠĠ Ġnode . set UserData ( Common . CHILD _ ID , Ġchild Id ) ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= ĠProperty ( node , Ġis Leaf , Ġis Generic Parent ) ĊĠĠĠĠĠĠĠ Ġnode . set UserData ( Common . PROPERTY _ KEY , Ġproperty ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Generic Parent ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( node Ġis ĠClass Or Interface Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġnode . type Arguments Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġnode . type Arguments . size Ġ> Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas No Children ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . children Nodes . size Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Not Comment ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode Ġ! is ĠComment Ġ&& Ġnode Ġ! is ĠStatement ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Child Id ( node : ĠNode ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnode . parentNode ĊĠĠĠĠĠĠĠ Ġval Ġparents Children Ġ= Ġparent . children Nodes ĊĠĠĠĠĠĠĠ Ġvar Ġchild Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġparents Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . range Ġ== Ġnode . range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchild Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Id ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġchild Id ĊĠĠĠ Ġ} Ċ } Ċ