/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.plsql.dfa; import java.util.logging.Level; import java.util.logging.Logger; import net.sourceforge.pmd.lang.DataFlowHandler; import net.sourceforge.pmd.lang.plsql.ast.ASTCompoundTriggerBlock; import net.sourceforge.pmd.lang.plsql.ast.ASTInput; import net.sourceforge.pmd.lang.plsql.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.plsql.ast.ASTProgramUnit; import net.sourceforge.pmd.lang.plsql.ast.ASTTriggerTimingPointSection; import net.sourceforge.pmd.lang.plsql.ast.ASTTriggerUnit; import net.sourceforge.pmd.lang.plsql.ast.ASTTypeMethod; import net.sourceforge.pmd.lang.plsql.ast.PLSQLParserVisitorAdapter; /** * TODO What about initializers? This only processes methods and * constructors. * * @author raik */ public class DataFlowFacade extends PLSQLParserVisitorAdapter { private static final String CLASS_PATH = DataFlowFacade.class.getCanonicalName(); private static final Logger LOGGER = Logger.getLogger(DataFlowFacade.class.getName()); private StatementAndBraceFinder sbf; private VariableAccessVisitor vav; public void initializeWith(DataFlowHandler dataFlowHandler, ASTInput node) { sbf = new StatementAndBraceFinder(dataFlowHandler); vav = new VariableAccessVisitor(); node.jjtAccept(this, null); } @Override public Object visit(ASTMethodDeclaration node, Object data) { LOGGER.entering(CLASS_PATH, "visit(ASTMethodDeclaration)"); if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.finest("visit(ASTMethodDeclaration): " + node.getClass().getCanonicalName() + " @ line " + node.getBeginLine() + ", column " + node.getBeginColumn() + " --- " + new Throwable().getStackTrace()); } super.visit(node, data); sbf.buildDataFlowFor(node); vav.compute(node); LOGGER.exiting(CLASS_PATH, "visit(ASTMethodDeclaration)"); return data; } @Override public Object visit(ASTTriggerUnit node, Object data) { LOGGER.entering(CLASS_PATH, "visit(ASTTriggerUnit)"); if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.finest( "visit(ASTTriggerUnit): " + node.getClass().getCanonicalName() + " @ line " + node.getBeginLine() + ", column " + node.getBeginColumn() + " --- " + new Throwable().getStackTrace()); } if (node.hasDescendantOfType(ASTCompoundTriggerBlock.class)) { if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.finest("visit(ASTTriggerUnit): treating ASTTriggerUnit like a PackageBody " + node.getClass().getCanonicalName() + " @ line " + node.getBeginLine() + ", column " + node.getBeginColumn() + " --- " + new Throwable().getStackTrace()); } // Pass super.visit(node, data); } { if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.finest("visit(ASTTriggerUnit): treating ASTTriggerUnit as standalone " + node.getClass().getCanonicalName() + " @ line " + node.getBeginLine() + ", column " + node.getBeginColumn() + " --- " + new Throwable().getStackTrace()); } sbf.buildDataFlowFor(node); vav.compute(node); } LOGGER.exiting(CLASS_PATH, "visit(ASTTriggerUnit)"); return data; } @Override public Object visit(ASTTriggerTimingPointSection node, Object data) { LOGGER.entering(CLASS_PATH, "visit(ASTTriggerTimingPointSection)"); if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.finest("visit(ASTTriggerTimingPointSection): " + node.getClass().getCanonicalName() + " @ line " + node.getBeginLine() + ", column " + node.getBeginColumn() + " --- " + new Throwable().getStackTrace()); } sbf.buildDataFlowFor(node); vav.compute(node); LOGGER.exiting(CLASS_PATH, "visit(ASTProgramUnit)"); return data; } @Override public Object visit(ASTProgramUnit node, Object data) { LOGGER.entering(CLASS_PATH, "visit(ASTProgramUnit)"); if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.finest( "visit(ASTProgramUnit): " + node.getClass().getCanonicalName() + " @ line " + node.getBeginLine() + ", column " + node.getBeginColumn() + " --- " + new Throwable().getStackTrace()); } sbf.buildDataFlowFor(node); vav.compute(node); LOGGER.exiting(CLASS_PATH, "visit(ASTProgramUnit)"); return data; } @Override public Object visit(ASTTypeMethod node, Object data) { LOGGER.entering(CLASS_PATH, "visit(ASTTypeMethod)"); if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.finest( "visit(ASTTypeMethod): " + node.getClass().getCanonicalName() + " @ line " + node.getBeginLine() + ", column " + node.getBeginColumn() + " --- " + new Throwable().getStackTrace()); } sbf.buildDataFlowFor(node); vav.compute(node); LOGGER.exiting(CLASS_PATH, "visit(ASTTypeMethod)"); return data; } }