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 }