1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3   */
4   package test.net.sourceforge.pmd.symboltable;
5   
6   import net.sourceforge.pmd.PMD;
7   import net.sourceforge.pmd.ast.ASTFormalParameter;
8   import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration;
9   import net.sourceforge.pmd.ast.ASTName;
10  import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
11  import net.sourceforge.pmd.ast.ASTVariableDeclaratorId;
12  import net.sourceforge.pmd.symboltable.LocalScope;
13  import net.sourceforge.pmd.symboltable.MethodScope;
14  import net.sourceforge.pmd.symboltable.NameDeclaration;
15  import net.sourceforge.pmd.symboltable.NameOccurrence;
16  import net.sourceforge.pmd.symboltable.VariableNameDeclaration;
17  
18  import java.util.List;
19  import java.util.Map;
20  
21  public class LocalScopeTest extends STBBaseTst {
22  
23      public void testNameWithThisOrSuperIsNotFlaggedAsUnused() {
24          LocalScope scope = new LocalScope();
25          ASTName name = new ASTName(1);
26          name.setImage("foo");
27          ASTPrimaryPrefix prefix = new ASTPrimaryPrefix(2);
28          prefix.setUsesThisModifier();
29          name.jjtAddChild(prefix, 1);
30          NameOccurrence occ = new NameOccurrence(name, "foo");
31          scope.addVariableNameOccurrence(occ);
32          assertTrue(!scope.getVariableDeclarations().keySet().iterator().hasNext());
33      }
34  
35      public void testNameWithSuperIsNotFlaggedAsUnused() {
36          LocalScope scope = new LocalScope();
37          ASTName name = new ASTName(1);
38          name.setImage("foo");
39          ASTPrimaryPrefix prefix = new ASTPrimaryPrefix(2);
40          prefix.setUsesSuperModifier();
41          name.jjtAddChild(prefix, 1);
42          NameOccurrence occ = new NameOccurrence(name, "foo");
43          scope.addVariableNameOccurrence(occ);
44          assertTrue(!scope.getVariableDeclarations().keySet().iterator().hasNext());
45      }
46  
47      public void testLocalVariableDeclarationFound() {
48          parseCode(TEST1);
49          List nodes = acu.findChildrenOfType(ASTVariableDeclaratorId.class);
50          ASTVariableDeclaratorId node = (ASTVariableDeclaratorId)nodes.get(0);
51          Map vars = node.getScope().getVariableDeclarations();
52          assertEquals(1, vars.size());
53          NameDeclaration decl = (NameDeclaration)vars.keySet().iterator().next();
54          assertEquals("b", decl.getImage());
55      }
56  
57      public void testQualifiedNameOccurrence() {
58          parseCode(TEST2);
59          List nodes = acu.findChildrenOfType(ASTVariableDeclaratorId.class);
60          ASTVariableDeclaratorId node = (ASTVariableDeclaratorId)nodes.get(0);
61          Map vars = node.getScope().getVariableDeclarations();
62          NameDeclaration decl = (NameDeclaration)vars.keySet().iterator().next();
63          NameOccurrence occ = (NameOccurrence)((List)vars.get(decl)).get(0);
64          assertEquals("b", occ.getImage());
65      }
66  
67      public void testPostfixUsageIsRecorded() {
68          parseCode(TEST3);
69          List nodes = acu.findChildrenOfType(ASTVariableDeclaratorId.class);
70          ASTVariableDeclaratorId node = (ASTVariableDeclaratorId)nodes.get(0);
71          Map vars = node.getScope().getVariableDeclarations();
72          NameDeclaration decl = (NameDeclaration)vars.keySet().iterator().next();
73          List usages = (List)vars.get(decl);
74          NameOccurrence occ = (NameOccurrence)usages.get(0);
75          assertEquals(4, occ.getLocation().getBeginLine());
76      }
77  
78      public void testLocalVariableTypesAreRecorded() {
79          parseCode(TEST1);
80          List nodes = acu.findChildrenOfType(ASTVariableDeclaratorId.class);
81          Map vars = ((ASTVariableDeclaratorId)nodes.get(0)).getScope().getVariableDeclarations();
82          VariableNameDeclaration decl = (VariableNameDeclaration)vars.keySet().iterator().next();
83          assertEquals("Bar", decl.getTypeImage());
84      }
85  
86      public void testMethodArgumentTypesAreRecorded() {
87          parseCode(TEST5);
88          List nodes = acu.findChildrenOfType(ASTFormalParameter.class);
89          Map vars = ((ASTFormalParameter)nodes.get(0)).getScope().getVariableDeclarations();
90          VariableNameDeclaration decl = (VariableNameDeclaration)vars.keySet().iterator().next();
91          assertEquals("String", decl.getTypeImage());
92      }
93  
94      public void testgetEnclosingMethodScope() {
95          parseCode(TEST4);
96          ASTLocalVariableDeclaration node = (ASTLocalVariableDeclaration)acu.findChildrenOfType(ASTLocalVariableDeclaration.class).get(0);
97          LocalScope scope = (LocalScope)node.getScope();
98          MethodScope ms  = scope.getEnclosingMethodScope();
99          assertEquals(2, ms.getVariableDeclarations().size());
100     }
101 
102 
103     public static final String TEST1 =
104     "public class Foo {" + PMD.EOL +
105     " void foo() {" + PMD.EOL +
106     "  Bar b = new Bar();" + PMD.EOL +
107     " }" + PMD.EOL +
108     "}";
109 
110     public static final String TEST2 =
111     "public class Foo {" + PMD.EOL +
112     " void foo() {" + PMD.EOL +
113     "  Bar b = new Bar();" + PMD.EOL +
114     "  b.buz = 2;" + PMD.EOL +
115     " }" + PMD.EOL +
116     "}";
117 
118     public static final String TEST3 =
119     "public class Foo {" + PMD.EOL +
120     " void foo() {" + PMD.EOL +
121     "  int x = 2;" + PMD.EOL +
122     "  x++;" + PMD.EOL +
123     " }" + PMD.EOL +
124     "}";
125 
126     public static final String TEST4 =
127     "public class Foo {" + PMD.EOL +
128     " void foo(String x, String z) { int y; }" + PMD.EOL +
129     "}";
130 
131     public static final String TEST5 =
132     "public class Foo {" + PMD.EOL +
133     " void foo(String x);" + PMD.EOL +
134     "}";
135 
136 }