1 package net.sourceforge.pmd.symboltable;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 /***
12 * Keeps track of the types encountered in a ASTCompilationUnit
13 */
14 public class TypeSet {
15
16
17 /***
18 * TODO should Resolver provide a canResolve() and a resolve()?
19 * Requiring 2 calls seems clunky... but so does this
20 * throwing an exception for flow control...
21 */
22 public interface Resolver {
23 Class resolve(String name) throws ClassNotFoundException;
24 }
25
26 public static class ExplicitImportResolver implements Resolver {
27 private Set importStmts;
28
29 public ExplicitImportResolver(Set importStmts) {
30 this.importStmts = importStmts;
31 }
32
33 public Class resolve(String name) throws ClassNotFoundException {
34 for (Iterator i = importStmts.iterator(); i.hasNext();) {
35 String importStmt = (String) i.next();
36 if (importStmt.endsWith(name)) {
37 return Class.forName(importStmt);
38 }
39 }
40 throw new ClassNotFoundException("Type " + name + " not found");
41 }
42 }
43
44 public static class CurrentPackageResolver implements Resolver {
45 private String pkg;
46
47 public CurrentPackageResolver(String pkg) {
48 this.pkg = pkg;
49 }
50
51 public Class resolve(String name) throws ClassNotFoundException {
52 return Class.forName(pkg + name);
53 }
54 }
55
56 // TODO cite the JLS section on implicit imports
57 public static class ImplicitImportResolver implements Resolver {
58 public Class resolve(String name) throws ClassNotFoundException {
59 return Class.forName("java.lang." + name);
60 }
61 }
62
63 public static class ImportOnDemandResolver implements Resolver {
64 private Set importStmts;
65
66 public ImportOnDemandResolver(Set importStmts) {
67 this.importStmts = importStmts;
68 }
69
70 public Class resolve(String name) throws ClassNotFoundException {
71 for (Iterator i = importStmts.iterator(); i.hasNext();) {
72 String importStmt = (String) i.next();
73 if (importStmt.endsWith("*")) {
74 try {
75 String importPkg = importStmt.substring(0, importStmt.indexOf("*") - 1);
76 return Class.forName(importPkg + "." + name);
77 } catch (ClassNotFoundException cnfe) {
78 }
79 }
80 }
81 throw new ClassNotFoundException("Type " + name + " not found");
82 }
83 }
84
85 public static class PrimitiveTypeResolver implements Resolver {
86 private Map primitiveTypes = new HashMap();
87
88 public PrimitiveTypeResolver() {
89 primitiveTypes.put("int", int.class);
90 primitiveTypes.put("float", float.class);
91 primitiveTypes.put("double", double.class);
92 primitiveTypes.put("long", long.class);
93 primitiveTypes.put("boolean", boolean.class);
94 primitiveTypes.put("byte", byte.class);
95 primitiveTypes.put("short", short.class);
96 primitiveTypes.put("char", char.class);
97 }
98
99 public Class resolve(String name) throws ClassNotFoundException {
100 if (!primitiveTypes.containsKey(name)) {
101 throw new ClassNotFoundException();
102 }
103 return (Class) primitiveTypes.get(name);
104 }
105 }
106
107 public static class VoidResolver implements Resolver {
108 public Class resolve(String name) throws ClassNotFoundException {
109 if (name.equals("void")) {
110 return void.class;
111 }
112 throw new ClassNotFoundException();
113 }
114 }
115
116 public static class FullyQualifiedNameResolver implements Resolver {
117 public Class resolve(String name) throws ClassNotFoundException {
118 return Class.forName(name);
119 }
120 }
121
122 private String pkg;
123 private Set imports = new HashSet();
124 private List resolvers = new ArrayList();
125
126 public void setASTCompilationUnitPackage(String pkg) {
127 this.pkg = pkg;
128 }
129
130 public String getASTCompilationUnitPackage() {
131 return pkg;
132 }
133
134 public void addImport(String importString) {
135 imports.add(importString);
136 }
137
138 public int getImportsCount() {
139 return imports.size();
140 }
141
142 public Class findClass(String name) throws ClassNotFoundException {
143 // we don't build the resolvers until now since we first want to get all the imports
144 if (resolvers.isEmpty()) {
145 buildResolvers();
146 }
147
148 for (Iterator i = resolvers.iterator(); i.hasNext();) {
149 Resolver resolver = (Resolver) i.next();
150 try {
151 return resolver.resolve(name);
152 } catch (ClassNotFoundException cnfe) {
153 }
154 }
155
156 throw new ClassNotFoundException("Type " + name + " not found");
157 }
158
159 private void buildResolvers() {
160 resolvers.add(new PrimitiveTypeResolver());
161 resolvers.add(new VoidResolver());
162 resolvers.add(new ExplicitImportResolver(imports));
163 resolvers.add(new CurrentPackageResolver(pkg));
164 resolvers.add(new ImplicitImportResolver());
165 resolvers.add(new ImportOnDemandResolver(imports));
166 resolvers.add(new FullyQualifiedNameResolver());
167 }
168
169 }
This page was automatically generated by Maven