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 }