langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java
changeset 22163 3651128c74eb
parent 22159 682da512ec17
child 25454 376a52c9540c
equal deleted inserted replaced
22162:3b3e23e67329 22163:3651128c74eb
    68     public static final String STARTLEVEL = "start";
    68     public static final String STARTLEVEL = "start";
    69 
    69 
    70     /**
    70     /**
    71      * List of ClassDoc objects for which ClassMembers objects are built.
    71      * List of ClassDoc objects for which ClassMembers objects are built.
    72      */
    72      */
    73     private final List<ClassDoc> visibleClasses = new ArrayList<ClassDoc>();
    73     private final List<ClassDoc> visibleClasses = new ArrayList<>();
    74 
    74 
    75     /**
    75     /**
    76      * Map for each member name on to a map which contains members with same
    76      * Map for each member name on to a map which contains members with same
    77      * name-signature. The mapped map will contain mapping for each MemberDoc
    77      * name-signature. The mapped map will contain mapping for each MemberDoc
    78      * onto it's respecive level string.
    78      * onto it's respecive level string.
    79      */
    79      */
    80     private final Map<Object,Map<ProgramElementDoc,String>> memberNameMap = new HashMap<Object,Map<ProgramElementDoc,String>>();
    80     private final Map<Object,Map<ProgramElementDoc,String>> memberNameMap = new HashMap<>();
    81 
    81 
    82     /**
    82     /**
    83      * Map of class and it's ClassMembers object.
    83      * Map of class and it's ClassMembers object.
    84      */
    84      */
    85     private final Map<ClassDoc,ClassMembers> classMap = new HashMap<ClassDoc,ClassMembers>();
    85     private final Map<ClassDoc,ClassMembers> classMap = new HashMap<>();
    86 
    86 
    87     /**
    87     /**
    88      * Type whose visible members are requested.  This is the leaf of
    88      * Type whose visible members are requested.  This is the leaf of
    89      * the class tree being mapped.
    89      * the class tree being mapped.
    90      */
    90      */
    98     /**
    98     /**
    99      * The configuration this VisibleMemberMap was created with.
    99      * The configuration this VisibleMemberMap was created with.
   100      */
   100      */
   101     private final Configuration configuration;
   101     private final Configuration configuration;
   102 
   102 
   103     private static final Map<ClassDoc, ProgramElementDoc[]> propertiesCache =
   103     private static final Map<ClassDoc, ProgramElementDoc[]> propertiesCache = new HashMap<>();
   104             new HashMap<ClassDoc, ProgramElementDoc[]>();
   104     private static final Map<ProgramElementDoc, ProgramElementDoc> classPropertiesMap = new HashMap<>();
   105     private static final Map<ProgramElementDoc, ProgramElementDoc> classPropertiesMap =
   105     private static final Map<ProgramElementDoc, GetterSetter> getterSetterMap = new HashMap<>();
   106             new HashMap<ProgramElementDoc, ProgramElementDoc>();
       
   107     private static final Map<ProgramElementDoc, GetterSetter> getterSetterMap =
       
   108             new HashMap<ProgramElementDoc, GetterSetter>();
       
   109 
   106 
   110     /**
   107     /**
   111      * Construct a VisibleMemberMap of the given type for the given
   108      * Construct a VisibleMemberMap of the given type for the given
   112      * class.
   109      * class.
   113      *
   110      *
   170      *
   167      *
   171      * @param configuration the current configuration of the doclet.
   168      * @param configuration the current configuration of the doclet.
   172      * @return the package private members inherited by the class.
   169      * @return the package private members inherited by the class.
   173      */
   170      */
   174     private List<ProgramElementDoc> getInheritedPackagePrivateMethods(Configuration configuration) {
   171     private List<ProgramElementDoc> getInheritedPackagePrivateMethods(Configuration configuration) {
   175         List<ProgramElementDoc> results = new ArrayList<ProgramElementDoc>();
   172         List<ProgramElementDoc> results = new ArrayList<>();
   176         for (ClassDoc currentClass : visibleClasses) {
   173         for (ClassDoc currentClass : visibleClasses) {
   177             if (currentClass != classdoc &&
   174             if (currentClass != classdoc &&
   178                 currentClass.isPackagePrivate() &&
   175                 currentClass.isPackagePrivate() &&
   179                 !Util.isLinkable(currentClass, configuration)) {
   176                 !Util.isLinkable(currentClass, configuration)) {
   180                 // Document these members in the child class because
   177                 // Document these members in the child class because
   206      * @return the list of members for the given class.
   203      * @return the list of members for the given class.
   207      */
   204      */
   208     public List<ProgramElementDoc> getMembersFor(ClassDoc cd) {
   205     public List<ProgramElementDoc> getMembersFor(ClassDoc cd) {
   209         ClassMembers clmembers = classMap.get(cd);
   206         ClassMembers clmembers = classMap.get(cd);
   210         if (clmembers == null) {
   207         if (clmembers == null) {
   211             return new ArrayList<ProgramElementDoc>();
   208             return new ArrayList<>();
   212         }
   209         }
   213         return clmembers.getMembers();
   210         return clmembers.getMembers();
   214     }
   211     }
   215 
   212 
   216     /**
   213     /**
   217      * Sort the given mixed list of classes and interfaces to a list of
   214      * Sort the given mixed list of classes and interfaces to a list of
   218      * classes followed by interfaces traversed. Don't sort alphabetically.
   215      * classes followed by interfaces traversed. Don't sort alphabetically.
   219      */
   216      */
   220     private void sort(List<ClassDoc> list) {
   217     private void sort(List<ClassDoc> list) {
   221         List<ClassDoc> classes = new ArrayList<ClassDoc>();
   218         List<ClassDoc> classes = new ArrayList<>();
   222         List<ClassDoc> interfaces = new ArrayList<ClassDoc>();
   219         List<ClassDoc> interfaces = new ArrayList<>();
   223         for (ClassDoc cd : list) {
   220         for (ClassDoc cd : list) {
   224             if (cd.isClass()) {
   221             if (cd.isClass()) {
   225                 classes.add(cd);
   222                 classes.add(cd);
   226             }
   223             }
   227             else {
   224             else {
   236     private void fillMemberLevelMap(List<ProgramElementDoc> list, String level) {
   233     private void fillMemberLevelMap(List<ProgramElementDoc> list, String level) {
   237         for (ProgramElementDoc element : list) {
   234         for (ProgramElementDoc element : list) {
   238             Object key = getMemberKey(element);
   235             Object key = getMemberKey(element);
   239             Map<ProgramElementDoc, String> memberLevelMap = memberNameMap.get(key);
   236             Map<ProgramElementDoc, String> memberLevelMap = memberNameMap.get(key);
   240             if (memberLevelMap == null) {
   237             if (memberLevelMap == null) {
   241                 memberLevelMap = new HashMap<ProgramElementDoc, String>();
   238                 memberLevelMap = new HashMap<>();
   242                 memberNameMap.put(key, memberLevelMap);
   239                 memberNameMap.put(key, memberLevelMap);
   243             }
   240             }
   244             memberLevelMap.put(element, level);
   241             memberLevelMap.put(element, level);
   245         }
   242         }
   246     }
   243     }
   261      */
   258      */
   262     private class ClassMember {
   259     private class ClassMember {
   263         private Set<ProgramElementDoc> members;
   260         private Set<ProgramElementDoc> members;
   264 
   261 
   265         public ClassMember(ProgramElementDoc programElementDoc) {
   262         public ClassMember(ProgramElementDoc programElementDoc) {
   266             members = new HashSet<ProgramElementDoc>();
   263             members = new HashSet<>();
   267             members.add(programElementDoc);
   264             members.add(programElementDoc);
   268         }
   265         }
   269 
   266 
   270         public void addMember(ProgramElementDoc programElementDoc) {
   267         public void addMember(ProgramElementDoc programElementDoc) {
   271             members.add(programElementDoc);
   268             members.add(programElementDoc);
   295         private ClassDoc mappingClass;
   292         private ClassDoc mappingClass;
   296 
   293 
   297         /**
   294         /**
   298          * List of inherited members from the mapping class.
   295          * List of inherited members from the mapping class.
   299          */
   296          */
   300         private List<ProgramElementDoc> members = new ArrayList<ProgramElementDoc>();
   297         private List<ProgramElementDoc> members = new ArrayList<>();
   301 
   298 
   302         /**
   299         /**
   303          * Level/Depth of inheritance.
   300          * Level/Depth of inheritance.
   304          */
   301          */
   305         private String level;
   302         private String level;
   366          * overridden, put such a member in the inherited member list.
   363          * overridden, put such a member in the inherited member list.
   367          * Adjust member-level-map, class-map.
   364          * Adjust member-level-map, class-map.
   368          */
   365          */
   369         private void addMembers(ClassDoc fromClass) {
   366         private void addMembers(ClassDoc fromClass) {
   370             List<ProgramElementDoc> cdmembers = getClassMembers(fromClass, true);
   367             List<ProgramElementDoc> cdmembers = getClassMembers(fromClass, true);
   371             List<ProgramElementDoc> incllist = new ArrayList<ProgramElementDoc>();
   368             List<ProgramElementDoc> incllist = new ArrayList<>();
   372             for (ProgramElementDoc pgmelem : cdmembers) {
   369             for (ProgramElementDoc pgmelem : cdmembers) {
   373                 if (!found(members, pgmelem) &&
   370                 if (!found(members, pgmelem) &&
   374                     memberIsVisible(pgmelem) &&
   371                     memberIsVisible(pgmelem) &&
   375                     !isOverridden(pgmelem, level) &&
   372                     !isOverridden(pgmelem, level) &&
   376                     !isTreatedAsPrivate(pgmelem)) {
   373                     !isTreatedAsPrivate(pgmelem)) {
   485          * required parameter.
   482          * required parameter.
   486          */
   483          */
   487         private AnnotationTypeElementDoc[] filter(AnnotationTypeDoc doc,
   484         private AnnotationTypeElementDoc[] filter(AnnotationTypeDoc doc,
   488             boolean required) {
   485             boolean required) {
   489             AnnotationTypeElementDoc[] members = doc.elements();
   486             AnnotationTypeElementDoc[] members = doc.elements();
   490             List<AnnotationTypeElementDoc> targetMembers = new ArrayList<AnnotationTypeElementDoc>();
   487             List<AnnotationTypeElementDoc> targetMembers = new ArrayList<>();
   491             for (AnnotationTypeElementDoc member : members) {
   488             for (AnnotationTypeElementDoc member : members) {
   492                 if ((required && member.defaultValue() == null) ||
   489                 if ((required && member.defaultValue() == null) ||
   493                     ((!required) && member.defaultValue() != null)) {
   490                     ((!required) && member.defaultValue() != null)) {
   494                     targetMembers.add(member);
   491                     targetMembers.add(member);
   495                 }
   492                 }
   532 
   529 
   533             if (propertiesCache.containsKey(cd)) {
   530             if (propertiesCache.containsKey(cd)) {
   534                 return propertiesCache.get(cd);
   531                 return propertiesCache.get(cd);
   535             }
   532             }
   536 
   533 
   537             final List<MethodDoc> result = new ArrayList<MethodDoc>();
   534             final List<MethodDoc> result = new ArrayList<>();
   538 
   535 
   539             for (final MethodDoc propertyMethod : allMethods) {
   536             for (final MethodDoc propertyMethod : allMethods) {
   540 
   537 
   541                 if (!isPropertyMethod(propertyMethod)) {
   538                 if (!isPropertyMethod(propertyMethod)) {
   542                     continue;
   539                     continue;