/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.symboltable; import net.sourceforge.pmd.ast.ASTBlock; import net.sourceforge.pmd.ast.ASTClassBodyDeclaration; import net.sourceforge.pmd.ast.ASTCompilationUnit; import net.sourceforge.pmd.ast.ASTConstructorDeclaration; import net.sourceforge.pmd.ast.ASTForStatement; import net.sourceforge.pmd.ast.ASTIfStatement; import net.sourceforge.pmd.ast.ASTMethodDeclaration; import net.sourceforge.pmd.ast.ASTSwitchStatement; import net.sourceforge.pmd.ast.ASTTryStatement; import net.sourceforge.pmd.ast.ASTUnmodifiedClassDeclaration; import net.sourceforge.pmd.ast.ASTUnmodifiedInterfaceDeclaration; import net.sourceforge.pmd.ast.JavaParserVisitorAdapter; import net.sourceforge.pmd.ast.SimpleNode; import java.util.Stack; /** * Serves as a sort of adaptor between the AST nodes and the symbol table scopes */ public class BasicScopeCreationVisitor extends JavaParserVisitorAdapter { private ScopeFactory sf; private Stack scopes = new Stack(); public BasicScopeCreationVisitor(ScopeFactory sf) { this.sf = sf; } public Object visit(ASTCompilationUnit node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTUnmodifiedClassDeclaration node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTClassBodyDeclaration node, Object data) { if (node.isAnonymousInnerClass()) { sf.openScope(scopes, node); cont(node); } else { super.visit(node, data); } return data; } public Object visit(ASTUnmodifiedInterfaceDeclaration node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTBlock node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTConstructorDeclaration node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTMethodDeclaration node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTTryStatement node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTForStatement node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTIfStatement node, Object data) { sf.openScope(scopes, node); cont(node); return data; } public Object visit(ASTSwitchStatement node, Object data) { sf.openScope(scopes, node); cont(node); return data; } private void cont(SimpleNode node) { super.visit(node, null); scopes.pop(); } }