package quickfix; import static edu.umd.cs.findbugs.plugin.eclipse.quickfix.util.ASTUtil.getASTNode; import edu.umd.cs.findbugs.BugInstance; import edu.umd.cs.findbugs.plugin.eclipse.quickfix.BugResolution; import edu.umd.cs.findbugs.plugin.eclipse.quickfix.exception.BugResolutionException; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SimpleType; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.TypeLiteral; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import util.QMethod; import util.TraversalUtil; public class LoggerOdditiesResolution extends BugResolution { @Override protected boolean resolveBindings() { return true; } @Override protected void repairBug(ASTRewrite rewrite, CompilationUnit workingUnit, BugInstance bug) throws BugResolutionException { ASTNode node = getASTNode(workingUnit, bug.getPrimarySourceLineAnnotation()); LOVisitor visitor = new LOVisitor(); node.accept(visitor); TypeLiteral fixedTypeLiteral = makeTypeLiteral(rewrite, node); rewrite.replace(visitor.badArgument, fixedTypeLiteral, null); } private TypeLiteral makeTypeLiteral(ASTRewrite rewrite, ASTNode node) { TypeDeclaration tDeclaration = TraversalUtil.findClosestAncestor(node, TypeDeclaration.class); SimpleName name = tDeclaration.getName(); AST ast = rewrite.getAST(); SimpleType parentType = ast.newSimpleType(ast.newSimpleName(name.getIdentifier())); TypeLiteral fixedTypeLiteral = ast.newTypeLiteral(); fixedTypeLiteral.setType(parentType); return fixedTypeLiteral; } private static class LOVisitor extends ASTVisitor { public Expression badArgument; @Override public boolean visit(MethodInvocation node) { if (badArgument != null) { return false; } QMethod qm = QMethod.make(node); if ("getLogger".equals(qm.invokedMethodString) && "org.apache.log4j.Logger".equals(qm.qualifiedTypeString)) { if (node.arguments().size() > 0) { badArgument = (Expression) node.arguments().get(0); return false; } } return true; } } }