package Ġnl . ut w ente . apollo . pmd . message pass ing Ċ Ċ import Ġnet . sourceforge . pmd . lang . java . ast . AST Class Or Interface Declaration Ċ import Ġnet . sourceforge . pmd . lang . java . ast . AST Compilation Unit Ċ import Ġnet . sourceforge . pmd . lang . java . ast . AST Primary Expression Ċ import Ġnet . sourceforge . pmd . lang . java . ast . Java Parser Visitor Adapter Ċ import Ġnet . sourceforge . pmd . lang . java . symbol table . Variable Name Declaration Ċ import Ġnl . ut w ente . processing . pmd . utils . get Containing Class Ċ import Ġnl . ut w ente . processing . pmd . utils . isIn Manip ulation Ċ import Ġnl . ut w ente . processing . pmd . utils . is MethodCall Ċ Ċ class ĠGlobal Variable Visitor Ġ: ĠJava Parser Visitor Adapter () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠAST Compilation Unit , Ġdata : ĠAny ?): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġmain Ġclass Ġis Ġthe Ġfirst Ġclass Ġdeclaration Ġin Ġthe Ġcompilation Ġunit ĊĠĠĠĠĠĠĠ Ġval Ġmain Class Ġ= Ġnode . getFirst Desc endant OfType ( AST Class Or Interface Declaration :: class . java ); ĊĠĠĠĠĠĠĠ Ġ// ĠGlobal Ġvariables Ġare Ġdefined Ġin Ġthis Ġmain Ġclass ĊĠĠĠĠĠĠĠ Ġval Ġglobal Variables Ġ= Ġmain Class . scope . declarations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFilter Ġon Ġvariables , Ġwe Ġare Ġnot Ġinterested Ġin Ġmethods Ġand Ġclasses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Keys Ġ{ Ġit Ġis ĠVariable Name Declaration Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġvariable Ġaccesses Ġthat Ġare Ġnot Ġin Ġthe Ġglobal Ġ( main Ġclass ) Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġit . value . filter Ġ{ Ġit . location . get Containing Class () Ġ!= Ġmain Class Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFilter Ġglobals Ġon Ġthe Ġones Ġthat Ġare Ġchanged , Ġso Ġwe Ġdon 't Ġmistake Ġa Ġglobal Ġconstant ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġ" f ridge Ġcommunication " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġprimary Ġexpression Ġthe Ġvariable Ġwas Ġused Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprim Expr Ġ= Ġit . location . getFirst Parent OfType ( AST Primary Expression :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInclude Ġthis Ġvar Ġif Ġit Ġis Ġmanip ulated Ġor Ġa Ġmethod Ġis Ġcalled Ġon Ġit Ġ( pot entially Ġmut ating Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprim Expr ?. isIn Manip ulation () Ġ?: Ġfalse Ġ|| Ġprim Expr ?. is MethodCall Ġ?: Ġfalse Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġnumber Ġof Ġkeys Ġis Ġthe Ġnumber Ġof Ġmut ated Ġglobal Ġvariables ĊĠĠĠĠĠĠĠ Ġval Ġglobal Var Count Ġ= Ġglobal Variables . count () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġsum med Ġnumber Ġof Ġitems Ġin Ġthe Ġvalues Ġis Ġthe Ġnumber Ġof Ġglobal Ġvariable Ġuses ĊĠĠĠĠĠĠĠ Ġval Ġglobal Var Usage Count Ġ= Ġglobal Variables . entries . map Ġ{ Ġit . value . size Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit ( node , ĠPair ( global Var Count , Ġglobal Var Usage Count )) ĊĠĠĠ Ġ} Ċ }