1 /*** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package net.sourceforge.pmd.symboltable; 5 6 import net.sourceforge.pmd.ast.ASTBlock; 7 import net.sourceforge.pmd.ast.ASTClassBodyDeclaration; 8 import net.sourceforge.pmd.ast.ASTCompilationUnit; 9 import net.sourceforge.pmd.ast.ASTConstructorDeclaration; 10 import net.sourceforge.pmd.ast.ASTForStatement; 11 import net.sourceforge.pmd.ast.ASTIfStatement; 12 import net.sourceforge.pmd.ast.ASTMethodDeclaration; 13 import net.sourceforge.pmd.ast.ASTSwitchStatement; 14 import net.sourceforge.pmd.ast.ASTTryStatement; 15 import net.sourceforge.pmd.ast.ASTUnmodifiedClassDeclaration; 16 import net.sourceforge.pmd.ast.ASTUnmodifiedInterfaceDeclaration; 17 import net.sourceforge.pmd.ast.JavaParserVisitorAdapter; 18 import net.sourceforge.pmd.ast.SimpleNode; 19 20 import java.util.Stack; 21 22 /*** 23 * Serves as a sort of adaptor between the AST nodes and the symbol table scopes 24 */ 25 public class BasicScopeCreationVisitor extends JavaParserVisitorAdapter { 26 27 private ScopeFactory sf; 28 private Stack scopes = new Stack(); 29 30 public BasicScopeCreationVisitor(ScopeFactory sf) { 31 this.sf = sf; 32 } 33 34 public Object visit(ASTCompilationUnit node, Object data) { 35 sf.openScope(scopes, node); 36 cont(node); 37 return data; 38 } 39 40 public Object visit(ASTUnmodifiedClassDeclaration node, Object data) { 41 sf.openScope(scopes, node); 42 cont(node); 43 return data; 44 } 45 46 public Object visit(ASTClassBodyDeclaration node, Object data) { 47 if (node.isAnonymousInnerClass()) { 48 sf.openScope(scopes, node); 49 cont(node); 50 } else { 51 super.visit(node, data); 52 } 53 return data; 54 } 55 56 public Object visit(ASTUnmodifiedInterfaceDeclaration node, Object data) { 57 sf.openScope(scopes, node); 58 cont(node); 59 return data; 60 } 61 62 public Object visit(ASTBlock node, Object data) { 63 sf.openScope(scopes, node); 64 cont(node); 65 return data; 66 } 67 68 public Object visit(ASTConstructorDeclaration node, Object data) { 69 sf.openScope(scopes, node); 70 cont(node); 71 return data; 72 } 73 74 public Object visit(ASTMethodDeclaration node, Object data) { 75 sf.openScope(scopes, node); 76 cont(node); 77 return data; 78 } 79 80 public Object visit(ASTTryStatement node, Object data) { 81 sf.openScope(scopes, node); 82 cont(node); 83 return data; 84 } 85 86 public Object visit(ASTForStatement node, Object data) { 87 sf.openScope(scopes, node); 88 cont(node); 89 return data; 90 } 91 92 public Object visit(ASTIfStatement node, Object data) { 93 sf.openScope(scopes, node); 94 cont(node); 95 return data; 96 } 97 98 public Object visit(ASTSwitchStatement node, Object data) { 99 sf.openScope(scopes, node); 100 cont(node); 101 return data; 102 } 103 104 private void cont(SimpleNode node) { 105 super.visit(node, null); 106 scopes.pop(); 107 } 108 }