View Javadoc
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