1 package net.sourceforge.pmd.lang.java.rule.finalizers; 2 3 import java.util.HashSet; 4 import java.util.List; 5 import java.util.Set; 6 7 import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; 8 import net.sourceforge.pmd.lang.java.ast.ASTName; 9 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; 10 import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; 11 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; 12 import net.sourceforge.pmd.lang.java.symboltable.MethodScope; 13 14 public class AvoidCallingFinalizeRule extends AbstractJavaRule { 15 16 private Set<MethodScope> checked = new HashSet<MethodScope>(); 17 18 public Object visit(ASTCompilationUnit acu, Object ctx) { 19 checked.clear(); 20 return super.visit(acu, ctx); 21 } 22 23 public Object visit(ASTName name, Object ctx) { 24 if (name.getImage() == null || !name.getImage().endsWith("finalize")) { 25 return ctx; 26 } 27 MethodScope meth = name.getScope().getEnclosingMethodScope(); 28 if (meth.getName().equals("finalize")) { 29 return ctx; 30 } 31 if (checked.contains(meth)) { 32 return ctx; 33 } 34 checked.add(meth); 35 addViolation(ctx, name); 36 return ctx; 37 } 38 39 public Object visit(ASTPrimaryPrefix pp, Object ctx) { 40 List<ASTPrimarySuffix> primarySuffixes = pp.jjtGetParent().findChildrenOfType(ASTPrimarySuffix.class); 41 ASTPrimarySuffix firstSuffix = null; 42 if (primarySuffixes.size() > 0) { 43 firstSuffix = primarySuffixes.get(0); 44 } 45 if (firstSuffix == null || firstSuffix.getImage() == null || !firstSuffix.getImage().endsWith("finalize")) { 46 return super.visit(pp, ctx); 47 } 48 MethodScope meth = pp.getScope().getEnclosingMethodScope(); 49 if (meth.getName().equals("finalize")) { 50 return super.visit(pp, ctx); 51 } 52 if (checked.contains(meth)) { 53 return super.visit(pp, ctx); 54 } 55 checked.add(meth); 56 addViolation(ctx, pp); 57 return super.visit(pp, ctx); 58 } 59 }