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          assertFalse(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          assertFalse(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 }