1 19 20 package org.netbeans.modules.java.source.pretty; 21 22 import com.sun.source.tree.ClassTree; 23 import com.sun.source.tree.ExpressionTree; 24 import com.sun.source.tree.IdentifierTree; 25 import com.sun.source.tree.ImportTree; 26 import com.sun.source.tree.MemberSelectTree; 27 import com.sun.source.tree.Tree; 28 import com.sun.source.tree.Tree.Kind; 29 import com.sun.source.util.TreeScanner; 30 import com.sun.source.util.Trees; 31 import com.sun.tools.javac.code.Symtab; 32 import com.sun.tools.javac.tree.JCTree.JCFieldAccess; 33 import com.sun.tools.javac.tree.JCTree.JCIdent; 34 import java.util.ArrayList ; 35 import java.util.Collections ; 36 import java.util.HashMap ; 37 import java.util.HashSet ; 38 import java.util.List ; 39 import java.util.Map ; 40 import java.util.Set ; 41 import java.util.Stack ; 42 import javax.lang.model.element.Element; 43 import javax.lang.model.element.ElementKind; 44 import javax.lang.model.element.Modifier; 45 import javax.lang.model.element.PackageElement; 46 import javax.lang.model.element.PackageElement; 47 import javax.lang.model.element.TypeElement; 48 import javax.lang.model.util.ElementFilter; 49 import javax.lang.model.util.Elements; 50 import javax.lang.model.util.Types; 51 import org.netbeans.api.java.source.WorkingCopy; 52 import org.netbeans.api.java.source.query.QueryEnvironment; 53 import org.netbeans.modules.java.source.engine.ASTModel; 54 import org.netbeans.modules.java.source.engine.EngineEnvironment; 55 import org.netbeans.api.java.source.transform.ChangeSet; 56 import org.netbeans.modules.java.source.engine.TreeMakerInt; 57 58 62 public class ImportAnalysis2 { 63 64 private Elements elements; 65 private Types types; 66 private Trees trees; 67 private ASTModel model; 68 private TreeMakerInt make; 69 private List <ImportTree> imports; 70 private Set <Element> imported; 71 private Stack <Set <Element>> visibleThroughClasses; 72 private Map <String , Element> simpleNames2Elements; 73 private PackageElement unnamedPackage; 74 private PackageElement pack; 75 76 private ChangeSet changes; 77 private WorkingCopy copy; 78 79 public ImportAnalysis2(QueryEnvironment env) { 80 elements = env.getElements(); 81 types = env.getTypes(); 82 model = ((EngineEnvironment)env).getModel(); 83 make = env.getTreeMaker(); 84 trees = env.getTrees(); 85 86 unnamedPackage = Symtab.instance(((EngineEnvironment) env).getContext()).unnamedPackage; 87 } 88 89 public void setPackage(ExpressionTree packageNameTree) { 90 if (packageNameTree == null) { 91 this.pack = unnamedPackage; 93 return ; 94 } 95 96 String packageName = getFQN(packageNameTree); 97 98 this.pack = elements.getPackageElement(packageName); 99 } 100 101 public void setImports(List <? extends ImportTree> importsToAdd) { 102 imports = new ArrayList <ImportTree>(); 103 imported = new HashSet <Element>(); 104 simpleNames2Elements = new HashMap <String , Element>(); 105 visibleThroughClasses = new Stack <Set <Element>>(); 106 107 for (ImportTree imp : importsToAdd) { 108 addImport(imp, false); 109 } 110 } 111 112 public List <? extends ImportTree> getImports() { 113 return imports; 114 } 115 116 public void classEntered(ClassTree clazz) { 117 Set <Element> visible = new HashSet <Element>(); 118 119 addAll(clazz.getExtendsClause(), visible); 120 121 for (Tree t : clazz.getImplementsClause()) { 122 addAll(t, visible); 123 } 124 125 visibleThroughClasses.push(visible); 126 } 127 128 public void classLeft() { 129 visibleThroughClasses.pop(); 130 } 131 132 private String getFQN(ImportTree imp) { 133 return getFQN(imp.getQualifiedIdentifier()); 134 } 135 136 private String getFQN(Tree expression) { 137 final StringBuffer result = new StringBuffer (); 138 139 new TreeScanner<Void , Void >() { 140 public Void visitMemberSelect(MemberSelectTree tree, Void p) { 141 super.visitMemberSelect(tree, p); 142 result.append('.'); 143 result.append(tree.getIdentifier().toString()); 144 return null; 145 } 146 public Void visitIdentifier(IdentifierTree tree, Void p) { 147 result.append(tree.getName().toString()); 148 return null; 149 } 150 }.scan(expression, null); 151 152 return result.toString(); 153 } 154 155 private void addImport(ImportTree imp, boolean sort) { 156 String fqn = getFQN(imp); 157 158 if (!imp.isStatic()) { 159 TypeElement resolve = elements.getTypeElement(fqn); 160 161 if (resolve != null) { 162 imported.add(resolve); 163 simpleNames2Elements.put(resolve.getSimpleName().toString(), resolve); 164 } else { 165 if (fqn.endsWith(".*")) { 167 fqn = fqn.substring(0, fqn.length() - 2); 168 169 List <TypeElement> classes = Collections.<TypeElement>emptyList(); 170 TypeElement clazz = elements.getTypeElement(fqn); 171 172 if (clazz != null) { 173 classes = ElementFilter.typesIn(clazz.getEnclosedElements()); 174 } else { 175 PackageElement pack = elements.getPackageElement(fqn); 176 177 if (pack != null) { 178 classes = ElementFilter.typesIn(pack.getEnclosedElements()); 179 } else { 180 } 182 } 183 184 for (TypeElement te : classes) { 185 imported.add(te); 186 simpleNames2Elements.put(te.getSimpleName().toString(), te); 187 } 188 } else { 189 } 191 } 192 } else { 193 int dot = fqn.lastIndexOf('.'); 194 195 if (dot != (-1)) { 196 String className = fqn.substring(0, dot); 197 String memberName = fqn.substring(dot + 1); 198 boolean isStarred = "*".equals(memberName); 199 TypeElement resolved = elements.getTypeElement(className); 200 201 if (resolved != null) { 202 for (Element e : resolved.getEnclosedElements()) { 203 if (!e.getModifiers().contains(Modifier.STATIC)) 204 continue; 205 206 if (isStarred || memberName.contains(e.getSimpleName().toString())) { 207 imported.add(e); 208 simpleNames2Elements.put(e.getSimpleName().toString(), e); 209 } 210 } 211 } else { 212 } 214 } else { 215 } 217 } 218 219 if (!sort) { 220 imports.add(imp); 221 } else { 222 int point = -1; 224 225 for (int cntr = 0; cntr < imports.size(); cntr++) { 226 String currentFQN = getFQN(imports.get(cntr)); 227 228 if (currentFQN.compareTo(fqn) < 0) { 229 point = cntr; 230 } else { 231 break; 233 } 234 } 235 236 imports.add(point + 1, imp); 237 } 238 } 239 240 public ExpressionTree resolveImport(MemberSelectTree orig, Element element) { 243 if (visibleThroughClasses == null) { 244 return orig; 246 } 247 for (Set <Element> els : visibleThroughClasses) { 249 if (els.contains(element)) 250 return make.Identifier(element.getSimpleName()); 251 } 252 253 if (element.getKind().isClass() || element.getKind().isInterface()) { 255 Element parent = element.getEnclosingElement(); 256 257 if (pack != null && pack.equals(parent)) { 258 return make.Identifier(element.getSimpleName()); 260 } 261 } 262 263 if (imported.contains(element)) { 264 return make.Identifier(element.getSimpleName()); 265 } 266 267 Element alreadyImported = simpleNames2Elements.get(element.getSimpleName().toString()); 268 269 if (alreadyImported != null && !element.equals(alreadyImported)) { 270 model.setElement(orig, null); 272 model.setType(orig, null); 273 return orig; 274 } 275 276 if (!element.getKind().isClass() && !element.getKind().isInterface()) { 278 ExpressionTree clazz = orig.getExpression(); 279 280 if (clazz.getKind() == Kind.MEMBER_SELECT) 281 clazz = resolveImport((MemberSelectTree) clazz, element.getEnclosingElement()); 282 283 return make.MemberSelect(clazz, orig.getIdentifier()); 284 } 285 286 TypeElement type = (TypeElement) element; 287 288 Element parent = type.getEnclosingElement(); 290 291 if (parent.getKind() == ElementKind.PACKAGE) { 292 if ("java.lang".equals(((PackageElement) parent).getQualifiedName().toString())) { 293 return make.Identifier(element.getSimpleName()); 294 } 295 } 296 297 Tree imp = make.QualIdentImpl(element); 298 addImport(make.Import(imp, false), true); 299 300 return make.Identifier(element.getSimpleName()); 301 } 302 303 private void addAll(Tree t, Set <Element> visible) { 304 if (t == null) 305 return; 306 307 Element e = null; 308 309 if (t.getKind() == Kind.MEMBER_SELECT) { 310 e = ((JCFieldAccess) t).sym; 311 } else { 312 if (t.getKind() == Kind.IDENTIFIER) { 313 e = ((JCIdent) t).sym; 314 } 315 } 316 317 if (e == null) 318 return; 319 320 visible.addAll(e.getEnclosedElements()); 321 } 322 323 } 324 | Popular Tags |