< prev index next >

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassUseMapper.java

Print this page




  29 import javax.lang.model.element.AnnotationMirror;
  30 import javax.lang.model.element.Element;
  31 import javax.lang.model.element.ExecutableElement;
  32 import javax.lang.model.element.PackageElement;
  33 import javax.lang.model.element.TypeElement;
  34 import javax.lang.model.element.TypeParameterElement;
  35 import javax.lang.model.element.VariableElement;
  36 import javax.lang.model.type.ArrayType;
  37 import javax.lang.model.type.DeclaredType;
  38 import javax.lang.model.type.ErrorType;
  39 import javax.lang.model.type.TypeMirror;
  40 import javax.lang.model.type.TypeVariable;
  41 import javax.lang.model.type.WildcardType;
  42 import javax.lang.model.util.ElementFilter;
  43 import javax.lang.model.util.Elements;
  44 import javax.lang.model.util.SimpleElementVisitor9;
  45 import javax.lang.model.util.SimpleTypeVisitor9;
  46 import javax.lang.model.util.Types;
  47 
  48 import jdk.javadoc.doclet.DocletEnvironment;
  49 import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
  50 import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap.Kind;
  51 
  52 /**
  53  * Map all class uses for a given class.
  54  *
  55  * <p>
  56  * <b>This is NOT part of any supported API. If you write code that depends on this, you do so at
  57  * your own risk. This code and its internal interfaces are subject to change or deletion without
  58  * notice.</b>
  59  *
  60  * @author Robert G. Field
  61  */
  62 public class ClassUseMapper {
  63 
  64     private final ClassTree classtree;
  65 
  66     /**
  67      * Mapping of TypeElements to set of PackageElements used by that class.
  68      */
  69     public final Map<TypeElement, Set<PackageElement>> classToPackage;


 175     /**
 176      * The mapping of TypeElements representing annotations to method parameters that use them.
 177      */
 178     public final Map<TypeElement, List<ExecutableElement>> classToMethodParamAnnotation = new HashMap<>();
 179 
 180     /**
 181      * The mapping of TypeElements to fields that use them as type parameters.
 182      */
 183     public final Map<TypeElement, List<VariableElement>> classToFieldTypeParam = new HashMap<>();
 184 
 185     /**
 186      * The mapping of TypeElements representing annotation to fields that use them.
 187      */
 188     public final Map<TypeElement, List<VariableElement>> annotationToField = new HashMap<>();
 189 
 190     private final DocletEnvironment docEnv;
 191     private final Elements elementUtils;
 192     private final Types typeUtils;
 193     private final Utils utils;
 194 
 195     public ClassUseMapper(HtmlConfiguration configuration, ClassTree classtree) {
 196         docEnv = configuration.docEnv;
 197         elementUtils = docEnv.getElementUtils();
 198         typeUtils = docEnv.getTypeUtils();
 199         utils = configuration.utils;
 200         this.classtree = classtree;
 201         classToPackage = new TreeMap<>(utils.makeClassUseComparator());
 202         // Map subclassing, subinterfacing implementing, ...
 203         for (TypeElement te : classtree.baseClasses()) {
 204             subclasses(te);
 205         }
 206         for (TypeElement intfc : classtree.baseInterfaces()) {
 207             // does subinterfacing as side-effect
 208             implementingClasses(intfc);
 209         }
 210         // Map methods, fields, constructors using a class.
 211         Set<TypeElement> classes = configuration.getIncludedTypeElements();
 212         for (TypeElement aClass : classes) {
 213             PackageElement pkg = elementUtils.getPackageOf(aClass);
 214             mapAnnotations(classToPackageAnnotations, pkg, pkg);
 215             mapTypeParameters(classToClassTypeParam, aClass, aClass);


 397                     return null;
 398                 }
 399 
 400                 @Override
 401                 public Void visitError(ErrorType t, ExecutableElement p) {
 402                     add(isConstructor ? classToConstructorThrows : classToMethodThrows,
 403                             (TypeElement) t.asElement(), p);
 404                     return null;
 405                 }
 406 
 407                 @Override
 408                 protected Void defaultAction(TypeMirror e, ExecutableElement p) {
 409                     throw new AssertionError("this should not happen");
 410                 }
 411             };
 412 
 413             stv.visit(typeUtils.erasure(anException), ee);
 414         }
 415     }
 416 
 417     private <T> List<T> refList(Map<TypeElement, List<T>> map, Element element) {
 418         List<T> list = map.get(element);
 419         if (list == null) {
 420             list = new ArrayList<>();
 421             map.put((TypeElement) element, list);
 422         }
 423         return list;
 424     }
 425 
 426     private Set<PackageElement> packageSet(TypeElement te) {
 427         Set<PackageElement> pkgSet = classToPackage.get(te);
 428         if (pkgSet == null) {
 429             pkgSet = new TreeSet<>(utils.makeClassUseComparator());
 430             classToPackage.put(te, pkgSet);
 431         }
 432         return pkgSet;
 433     }
 434 
 435     private Set<TypeElement> classSet(TypeElement te) {
 436         Set<TypeElement> clsSet = classToClass.get(te);
 437         if (clsSet == null) {
 438             clsSet = new TreeSet<>(utils.makeClassUseComparator());
 439             classToClass.put(te, clsSet);
 440         }
 441         return clsSet;


 553     /**
 554      * Map the AnnotationType to the members that use them as type parameters.
 555      *
 556      * @param map the map the insert the information into.
 557      * @param element whose type parameters are being checked.
 558      * @param holder the holder that owns the type parameters.
 559      */
 560     private <T extends Element> void mapAnnotations(final Map<TypeElement, List<T>> map,
 561             Element e, final T holder) {
 562         new SimpleElementVisitor9<Void, Void>() {
 563 
 564             void addAnnotations(Element e) {
 565                 for (AnnotationMirror a : e.getAnnotationMirrors()) {
 566                     add(map, (TypeElement) a.getAnnotationType().asElement(), holder);
 567                 }
 568             }
 569 
 570             @Override
 571             public Void visitPackage(PackageElement e, Void p) {
 572                 for (AnnotationMirror a : e.getAnnotationMirrors()) {
 573                     refList(map, a.getAnnotationType().asElement()).add(holder);
 574                 }
 575                 return null;
 576             }
 577 
 578             @Override
 579             protected Void defaultAction(Element e, Void p) {
 580                 addAnnotations(e);
 581                 return null;
 582             }
 583         }.visit(e);
 584     }
 585 
 586     private <T extends Element> void addTypeParameterToMap(final Map<TypeElement, List<T>> map,
 587             TypeMirror type, final T holder) {
 588         new SimpleTypeVisitor9<Void, Void>() {
 589 
 590             @Override
 591             protected Void defaultAction(TypeMirror e, Void p) {
 592                 return super.defaultAction(e, p);
 593             }


  29 import javax.lang.model.element.AnnotationMirror;
  30 import javax.lang.model.element.Element;
  31 import javax.lang.model.element.ExecutableElement;
  32 import javax.lang.model.element.PackageElement;
  33 import javax.lang.model.element.TypeElement;
  34 import javax.lang.model.element.TypeParameterElement;
  35 import javax.lang.model.element.VariableElement;
  36 import javax.lang.model.type.ArrayType;
  37 import javax.lang.model.type.DeclaredType;
  38 import javax.lang.model.type.ErrorType;
  39 import javax.lang.model.type.TypeMirror;
  40 import javax.lang.model.type.TypeVariable;
  41 import javax.lang.model.type.WildcardType;
  42 import javax.lang.model.util.ElementFilter;
  43 import javax.lang.model.util.Elements;
  44 import javax.lang.model.util.SimpleElementVisitor9;
  45 import javax.lang.model.util.SimpleTypeVisitor9;
  46 import javax.lang.model.util.Types;
  47 
  48 import jdk.javadoc.doclet.DocletEnvironment;
  49 import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
  50 import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap.Kind;
  51 
  52 /**
  53  * Map all class uses for a given class.
  54  *
  55  * <p>
  56  * <b>This is NOT part of any supported API. If you write code that depends on this, you do so at
  57  * your own risk. This code and its internal interfaces are subject to change or deletion without
  58  * notice.</b>
  59  *
  60  * @author Robert G. Field
  61  */
  62 public class ClassUseMapper {
  63 
  64     private final ClassTree classtree;
  65 
  66     /**
  67      * Mapping of TypeElements to set of PackageElements used by that class.
  68      */
  69     public final Map<TypeElement, Set<PackageElement>> classToPackage;


 175     /**
 176      * The mapping of TypeElements representing annotations to method parameters that use them.
 177      */
 178     public final Map<TypeElement, List<ExecutableElement>> classToMethodParamAnnotation = new HashMap<>();
 179 
 180     /**
 181      * The mapping of TypeElements to fields that use them as type parameters.
 182      */
 183     public final Map<TypeElement, List<VariableElement>> classToFieldTypeParam = new HashMap<>();
 184 
 185     /**
 186      * The mapping of TypeElements representing annotation to fields that use them.
 187      */
 188     public final Map<TypeElement, List<VariableElement>> annotationToField = new HashMap<>();
 189 
 190     private final DocletEnvironment docEnv;
 191     private final Elements elementUtils;
 192     private final Types typeUtils;
 193     private final Utils utils;
 194 
 195     public ClassUseMapper(BaseConfiguration configuration, ClassTree classtree) {
 196         docEnv = configuration.docEnv;
 197         elementUtils = docEnv.getElementUtils();
 198         typeUtils = docEnv.getTypeUtils();
 199         utils = configuration.utils;
 200         this.classtree = classtree;
 201         classToPackage = new TreeMap<>(utils.makeClassUseComparator());
 202         // Map subclassing, subinterfacing implementing, ...
 203         for (TypeElement te : classtree.baseClasses()) {
 204             subclasses(te);
 205         }
 206         for (TypeElement intfc : classtree.baseInterfaces()) {
 207             // does subinterfacing as side-effect
 208             implementingClasses(intfc);
 209         }
 210         // Map methods, fields, constructors using a class.
 211         Set<TypeElement> classes = configuration.getIncludedTypeElements();
 212         for (TypeElement aClass : classes) {
 213             PackageElement pkg = elementUtils.getPackageOf(aClass);
 214             mapAnnotations(classToPackageAnnotations, pkg, pkg);
 215             mapTypeParameters(classToClassTypeParam, aClass, aClass);


 397                     return null;
 398                 }
 399 
 400                 @Override
 401                 public Void visitError(ErrorType t, ExecutableElement p) {
 402                     add(isConstructor ? classToConstructorThrows : classToMethodThrows,
 403                             (TypeElement) t.asElement(), p);
 404                     return null;
 405                 }
 406 
 407                 @Override
 408                 protected Void defaultAction(TypeMirror e, ExecutableElement p) {
 409                     throw new AssertionError("this should not happen");
 410                 }
 411             };
 412 
 413             stv.visit(typeUtils.erasure(anException), ee);
 414         }
 415     }
 416 
 417     private <T> List<T> refList(Map<TypeElement, List<T>> map, TypeElement element) {
 418         List<T> list = map.get(element);
 419         if (list == null) {
 420             list = new ArrayList<>();
 421             map.put(element, list);
 422         }
 423         return list;
 424     }
 425 
 426     private Set<PackageElement> packageSet(TypeElement te) {
 427         Set<PackageElement> pkgSet = classToPackage.get(te);
 428         if (pkgSet == null) {
 429             pkgSet = new TreeSet<>(utils.makeClassUseComparator());
 430             classToPackage.put(te, pkgSet);
 431         }
 432         return pkgSet;
 433     }
 434 
 435     private Set<TypeElement> classSet(TypeElement te) {
 436         Set<TypeElement> clsSet = classToClass.get(te);
 437         if (clsSet == null) {
 438             clsSet = new TreeSet<>(utils.makeClassUseComparator());
 439             classToClass.put(te, clsSet);
 440         }
 441         return clsSet;


 553     /**
 554      * Map the AnnotationType to the members that use them as type parameters.
 555      *
 556      * @param map the map the insert the information into.
 557      * @param element whose type parameters are being checked.
 558      * @param holder the holder that owns the type parameters.
 559      */
 560     private <T extends Element> void mapAnnotations(final Map<TypeElement, List<T>> map,
 561             Element e, final T holder) {
 562         new SimpleElementVisitor9<Void, Void>() {
 563 
 564             void addAnnotations(Element e) {
 565                 for (AnnotationMirror a : e.getAnnotationMirrors()) {
 566                     add(map, (TypeElement) a.getAnnotationType().asElement(), holder);
 567                 }
 568             }
 569 
 570             @Override
 571             public Void visitPackage(PackageElement e, Void p) {
 572                 for (AnnotationMirror a : e.getAnnotationMirrors()) {
 573                     refList(map, (TypeElement) a.getAnnotationType().asElement()).add(holder);
 574                 }
 575                 return null;
 576             }
 577 
 578             @Override
 579             protected Void defaultAction(Element e, Void p) {
 580                 addAnnotations(e);
 581                 return null;
 582             }
 583         }.visit(e);
 584     }
 585 
 586     private <T extends Element> void addTypeParameterToMap(final Map<TypeElement, List<T>> map,
 587             TypeMirror type, final T holder) {
 588         new SimpleTypeVisitor9<Void, Void>() {
 589 
 590             @Override
 591             protected Void defaultAction(TypeMirror e, Void p) {
 592                 return super.defaultAction(e, p);
 593             }
< prev index next >