src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberTable.java
author hannesw
Mon, 07 Oct 2019 15:58:04 +0200
changeset 58477 d148a7e7160c
parent 55064 cb35ce1770a0
permissions -rw-r--r--
8220217: Javadoc missing link to member method Reviewed-by: jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     1
/*
55064
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     4
 *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    10
 *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    15
 * accompanied this code).
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    16
 *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    20
 *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    23
 * questions.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    24
 */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    25
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    26
package jdk.javadoc.internal.doclets.toolkit.util;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    27
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    28
import javax.lang.model.element.Element;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    29
import javax.lang.model.element.ExecutableElement;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    30
import javax.lang.model.element.TypeElement;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    31
import javax.lang.model.element.VariableElement;
55064
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
    32
import javax.lang.model.type.TypeKind;
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    33
import javax.lang.model.type.TypeMirror;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    34
import javax.lang.model.util.Elements;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    35
import javax.lang.model.util.SimpleElementVisitor9;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    36
import java.lang.ref.SoftReference;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    37
import java.util.ArrayList;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    38
import java.util.Collections;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    39
import java.util.EnumMap;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    40
import java.util.EnumSet;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    41
import java.util.HashMap;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    42
import java.util.LinkedHashMap;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    43
import java.util.LinkedHashSet;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    44
import java.util.List;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    45
import java.util.Map;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    46
import java.util.Set;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    47
import java.util.function.Predicate;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    48
import java.util.stream.Collectors;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    49
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    50
import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    51
import jdk.javadoc.internal.doclets.toolkit.PropertyUtils;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    52
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    53
/**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    54
 * This class computes the main data structure for the doclet's
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    55
 * operations. Essentially, the implementation encapsulating the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    56
 * javax.lang.models view of what can be documented about a
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    57
 * type element's members.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    58
 * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    59
 * The general operations are as follows:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    60
 * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    61
 * Members: these are the members from jx.l.m's view but
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    62
 * are structured along the kinds of this class.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    63
 * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    64
 * Extra Members: these are members enclosed in an undocumented
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    65
 * package-private type element, and may not be linkable (or documented),
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    66
 * however, the members of such a type element may be documented, as if
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    67
 * declared in the sub type, only if the enclosing type is not being
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    68
 * documented by a filter such as -public, -protected, etc.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    69
 * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    70
 * Visible Members: these are the members that are "visible"
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    71
 * and available and should be documented, in a type element.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    72
 * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    73
 * The basic rule for computation: when considering a type element,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    74
 * besides its immediate direct types and interfaces, the computation
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    75
 * should not expand to any other type in the inheritance hierarchy.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    76
 * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    77
 * This table generates all the data structures it needs for each
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    78
 * type, as its own view, and will present some form of this to the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    79
 * doclet as and when required to.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    80
 *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    81
 * <p><b>This is NOT part of any supported API.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    82
 * If you write code that depends on this, you do so at your own risk.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    83
 * This code and its internal interfaces are subject to change or
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    84
 * deletion without notice.</b>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    85
 *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    86
 */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    87
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    88
public class VisibleMemberTable {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    89
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    90
    public enum Kind {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    91
        INNER_CLASSES,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    92
        ENUM_CONSTANTS,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    93
        FIELDS,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    94
        CONSTRUCTORS,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    95
        METHODS,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    96
        ANNOTATION_TYPE_FIELDS,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    97
        ANNOTATION_TYPE_MEMBER_OPTIONAL,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    98
        ANNOTATION_TYPE_MEMBER_REQUIRED,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
    99
        PROPERTIES;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   100
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   101
        public static final EnumSet<Kind> summarySet = EnumSet.range(INNER_CLASSES, METHODS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   102
        public static final EnumSet<Kind> detailSet = EnumSet.range(ENUM_CONSTANTS, METHODS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   103
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   104
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   105
    final TypeElement te;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   106
    final TypeElement parent;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   107
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   108
    final BaseConfiguration config;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   109
    final Utils utils;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   110
    final VisibleMemberCache mcache;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   111
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   112
    private List<VisibleMemberTable> allSuperclasses;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   113
    private List<VisibleMemberTable> allSuperinterfaces;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   114
    private List<VisibleMemberTable> parents;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   115
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   116
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   117
    private Map<Kind, List<Element>> extraMembers = new EnumMap<>(Kind.class);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   118
    private Map<Kind, List<Element>> visibleMembers = null;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   119
    private Map<ExecutableElement, PropertyMembers> propertyMap = new HashMap<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   120
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   121
    // Keeps track of method overrides
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   122
    Map<ExecutableElement, OverridingMethodInfo> overriddenMethodTable
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   123
            = new LinkedHashMap<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   124
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   125
    protected VisibleMemberTable(TypeElement typeElement, BaseConfiguration configuration,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   126
                                 VisibleMemberCache mcache) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   127
        config = configuration;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   128
        utils = configuration.utils;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   129
        te = typeElement;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   130
        parent = utils.getSuperClass(te);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   131
        this.mcache = mcache;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   132
        allSuperclasses = new ArrayList<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   133
        allSuperinterfaces = new ArrayList<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   134
        parents = new ArrayList<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   135
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   136
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   137
    private synchronized void ensureInitialized() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   138
        if (visibleMembers != null)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   139
            return;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   140
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   141
        visibleMembers = new EnumMap<>(Kind.class);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   142
        for (Kind kind : Kind.values()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   143
            visibleMembers.put(kind, new ArrayList<>());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   144
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   145
        computeParents();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   146
        computeVisibleMembers();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   147
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   148
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   149
    List<? extends Element> getExtraMembers(Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   150
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   151
        return visibleMembers.getOrDefault(kind, Collections.emptyList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   152
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   153
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   154
    List<VisibleMemberTable> getAllSuperclasses() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   155
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   156
        return allSuperclasses;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   157
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   158
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   159
    List<VisibleMemberTable> getAllSuperinterfaces() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   160
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   161
        return allSuperinterfaces;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   162
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   163
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   164
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   165
     * Returns a list of all visible enclosed members of a type element,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   166
     * and inherited members.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   167
     * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   168
     * Notes:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   169
     * a. The list may or may not contain simple overridden methods.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   170
     * A simple overridden method is one that overrides a super method
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   171
     * with no specification changes as indicated by the existence of a
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   172
     * sole &commat;inheritDoc or devoid of any API commments.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   173
     * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   174
     * b.The list may contain (extra) members, inherited by inaccessible
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   175
     * super types, primarily package private types. These members are
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   176
     * required to be documented in the subtype when the super type is
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   177
     * not documented.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   178
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   179
     * @param kind the member kind
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   180
     * @return a list of all visible members
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   181
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   182
    public List<? extends Element> getAllVisibleMembers(Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   183
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   184
        return visibleMembers.getOrDefault(kind, Collections.emptyList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   185
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   186
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   187
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   188
     * Returns a list of visible enclosed members of a specified kind,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   189
     * filtered by the specified predicate.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   190
     * @param kind the member kind
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   191
     * @param p the predicate used to filter the output
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   192
     * @return a list of visible enclosed members
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   193
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   194
    public List<? extends Element> getVisibleMembers(Kind kind, Predicate<Element> p) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   195
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   196
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   197
        return visibleMembers.getOrDefault(kind, Collections.emptyList()).stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   198
                .filter(p)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   199
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   200
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   201
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   202
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   203
     * Returns a list of all enclosed members including any extra members.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   204
     * Typically called by various builders.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   205
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   206
     * @param kind the member kind
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   207
     * @return a list of visible enclosed members
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   208
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   209
    public List<? extends Element> getVisibleMembers(Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   210
        Predicate<Element> declaredAndLeafMembers = e -> {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   211
            TypeElement encl = utils.getEnclosingTypeElement(e);
58477
d148a7e7160c 8220217: Javadoc missing link to member method
hannesw
parents: 55064
diff changeset
   212
            return encl == te || utils.isUndocumentedEnclosure(encl);
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   213
        };
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   214
        return getVisibleMembers(kind, declaredAndLeafMembers);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   215
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   216
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   217
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   218
     * Returns a list of visible enclosed members of given kind,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   219
     * declared in this type element, and does not include
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   220
     * any inherited members or extra members.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   221
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   222
     * @return a list of visible enclosed members in this type
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   223
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   224
    public List<? extends Element> getMembers(Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   225
        Predicate<Element> onlyLocallyDeclaredMembers = e -> utils.getEnclosingTypeElement(e) == te;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   226
        return getVisibleMembers(kind, onlyLocallyDeclaredMembers);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   227
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   228
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   229
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   230
     * Returns the overridden method, if it is simply overridding or the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   231
     * method is a member of a package private type, this method is
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   232
     * primarily used to determine the location of a possible comment.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   233
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   234
     * @param e the method to check
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   235
     * @return the method found or null
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   236
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   237
    public ExecutableElement getOverriddenMethod(ExecutableElement e) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   238
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   239
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   240
        OverridingMethodInfo found = overriddenMethodTable.get(e);
58477
d148a7e7160c 8220217: Javadoc missing link to member method
hannesw
parents: 55064
diff changeset
   241
        if (found != null
d148a7e7160c 8220217: Javadoc missing link to member method
hannesw
parents: 55064
diff changeset
   242
                && (found.simpleOverride || utils.isUndocumentedEnclosure(utils.getEnclosingTypeElement(e)))) {
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   243
            return found.overrider;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   244
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   245
        return null;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   246
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   247
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   248
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   249
     * Returns the simply overridden method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   250
     * @param e the method to check
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   251
     * @return the overridden method or null
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   252
     */
52174
8f93292c2a51 8211901: javadoc generates broken links on deprecated items page
pmuthuswamy
parents: 50672
diff changeset
   253
    public ExecutableElement getSimplyOverriddenMethod(ExecutableElement e) {
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   254
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   255
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   256
        OverridingMethodInfo found = overriddenMethodTable.get(e);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   257
        if (found != null && found.simpleOverride) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   258
            return found.overrider;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   259
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   260
        return null;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   261
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   262
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   263
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   264
     * Returns a set of visible type elements in this type element's lineage.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   265
     * <p>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   266
     * This method returns the super-types in the inheritance
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   267
     * order C, B, A, j.l.O. The super-interfaces however are
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   268
     * alpha sorted and appended to the resulting set.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   269
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   270
     * @return the list of visible classes in this map.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   271
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   272
    public Set<TypeElement> getVisibleTypeElements() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   273
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   274
        Set<TypeElement> result = new LinkedHashSet<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   275
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   276
        // Add this type element first.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   277
        result.add(te);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   278
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   279
        // Add the super classes.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   280
        allSuperclasses.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   281
                .map(vmt -> vmt.te)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   282
                .forEach(result::add);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   283
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   284
        // ... and finally the sorted super interfaces.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   285
        allSuperinterfaces.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   286
                .map(vmt -> vmt.te)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   287
                .sorted(utils.makeGeneralPurposeComparator())
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   288
                .forEach(result::add);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   289
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   290
        return result;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   291
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   292
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   293
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   294
     * Returns true if this table contains visible members.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   295
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   296
     * @return true if visible members are present.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   297
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   298
    public boolean hasVisibleMembers() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   299
        for (Kind kind : Kind.values()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   300
            if (hasVisibleMembers(kind))
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   301
                return true;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   302
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   303
        return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   304
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   305
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   306
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   307
     * Returns true if this table contains visible members of
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   308
     * the specified kind, including inhertied members.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   309
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   310
     * @return true if visible members are present.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   311
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   312
    public boolean hasVisibleMembers(Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   313
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   314
        List<Element> elements = visibleMembers.get(kind);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   315
        return elements != null && !elements.isEmpty();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   316
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   317
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   318
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   319
     * Returns the property field associated with the property method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   320
     * @param propertyMethod the identifying property method
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   321
     * @return the field or null if absent
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   322
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   323
    public VariableElement getPropertyField(ExecutableElement propertyMethod) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   324
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   325
        PropertyMembers pm =  propertyMap.get(propertyMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   326
        return pm == null ? null : pm.field;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   327
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   328
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   329
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   330
     * Returns the getter method associated with the property method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   331
     * @param propertyMethod the identifying property method
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   332
     * @return the getter or null if absent
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   333
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   334
    public ExecutableElement getPropertyGetter(ExecutableElement propertyMethod) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   335
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   336
        PropertyMembers pm =  propertyMap.get(propertyMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   337
        return pm == null ? null : pm.getter;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   338
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   339
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   340
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   341
     * Returns the setter method associated with the property method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   342
     * @param propertyMethod the identifying property method
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   343
     * @return the setter or null if absent
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   344
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   345
    public ExecutableElement getPropertySetter(ExecutableElement propertyMethod) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   346
        ensureInitialized();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   347
        PropertyMembers pm =  propertyMap.get(propertyMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   348
        return pm == null ? null : pm.setter;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   349
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   350
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   351
    private void computeParents() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   352
        for (TypeMirror intfType : te.getInterfaces()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   353
            TypeElement intfc = utils.asTypeElement(intfType);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   354
            if (intfc != null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   355
                VisibleMemberTable vmt = mcache.getVisibleMemberTable(intfc);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   356
                allSuperinterfaces.add(vmt);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   357
                parents.add(vmt);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   358
                allSuperinterfaces.addAll(vmt.getAllSuperinterfaces());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   359
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   360
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   361
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   362
        if (parent != null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   363
            VisibleMemberTable vmt = mcache.getVisibleMemberTable(parent);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   364
            allSuperclasses.add(vmt);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   365
            allSuperclasses.addAll(vmt.getAllSuperclasses());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   366
            // Add direct super interfaces of a super class, if any.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   367
            allSuperinterfaces.addAll(vmt.getAllSuperinterfaces());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   368
            parents.add(vmt);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   369
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   370
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   371
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   372
    private void computeVisibleMembers() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   373
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   374
        // Note: these have some baggage, and are redundant,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   375
        // allow this to be GC'ed.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   376
        LocalMemberTable lmt = new LocalMemberTable();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   377
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   378
        for (Kind k : Kind.values()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   379
            computeLeafMembers(lmt, k);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   380
            computeVisibleMembers(lmt, k);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   381
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   382
        // All members have been computed, compute properties.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   383
        computeVisibleProperties(lmt);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   384
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   385
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   386
    private void computeLeafMembers(LocalMemberTable lmt, Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   387
        List<Element> list = new ArrayList<>();
58477
d148a7e7160c 8220217: Javadoc missing link to member method
hannesw
parents: 55064
diff changeset
   388
        if (utils.isUndocumentedEnclosure(te)) {
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   389
            list.addAll(lmt.getOrderedMembers(kind));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   390
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   391
        parents.forEach(pvmt -> {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   392
            list.addAll(pvmt.getExtraMembers(kind));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   393
        });
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   394
        extraMembers.put(kind, Collections.unmodifiableList(list));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   395
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   396
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   397
    void computeVisibleMembers(LocalMemberTable lmt, Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   398
        switch (kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   399
            case FIELDS: case INNER_CLASSES:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   400
                computeVisibleFieldsAndInnerClasses(lmt, kind);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   401
                return;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   402
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   403
            case METHODS:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   404
                computeVisibleMethods(lmt);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   405
                return;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   406
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   407
            // Defer properties related computations for later.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   408
            case PROPERTIES:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   409
                return;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   410
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   411
            default:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   412
                List<Element> list = lmt.getOrderedMembers(kind).stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   413
                        .filter(this::mustDocument)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   414
                        .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   415
                visibleMembers.put(kind, Collections.unmodifiableList(list));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   416
                break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   417
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   418
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   419
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   420
    private boolean mustDocument(Element e) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   421
        return !utils.hasHiddenTag(e) && utils.shouldDocument(e);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   422
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   423
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   424
    private boolean allowInheritedMembers(Element e, Kind kind, LocalMemberTable lmt) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   425
        return isInherited(e) && !isMemberHidden(e, kind, lmt);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   426
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   427
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   428
    private boolean isInherited(Element e) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   429
        if (utils.isPrivate(e))
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   430
            return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   431
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   432
        if (utils.isPackagePrivate(e))
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   433
            // Allowed iff this type-element is in the same package as the element
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   434
            return utils.containingPackage(e).equals(utils.containingPackage(te));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   435
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   436
        return true;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   437
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   438
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   439
    private boolean isMemberHidden(Element inheritedMember, Kind kind, LocalMemberTable lmt) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   440
        Elements elementUtils = config.docEnv.getElementUtils();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   441
        switch(kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   442
            default:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   443
                List<Element> list = lmt.getMembers(inheritedMember, kind);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   444
                if (list.isEmpty())
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   445
                    return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   446
                return elementUtils.hides(list.get(0), inheritedMember);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   447
            case METHODS: case CONSTRUCTORS: // Handled elsewhere.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   448
                throw new IllegalArgumentException("incorrect kind");
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   449
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   450
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   451
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   452
    private void computeVisibleFieldsAndInnerClasses(LocalMemberTable lmt, Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   453
        Set<Element> result = new LinkedHashSet<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   454
        for (VisibleMemberTable pvmt : parents) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   455
            result.addAll(pvmt.getExtraMembers(kind));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   456
            result.addAll(pvmt.getAllVisibleMembers(kind));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   457
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   458
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   459
        // Filter out members in the inherited list that are hidden
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   460
        // by this type or should not be inherited at all.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   461
        List<Element> list = result.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   462
                .filter(e -> allowInheritedMembers(e, kind, lmt)).collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   463
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   464
        // Prefix local results first
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   465
        list.addAll(0, lmt.getOrderedMembers(kind));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   466
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   467
        // Filter out elements that should not be documented
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   468
        list = list.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   469
                .filter(this::mustDocument)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   470
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   471
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   472
        visibleMembers.put(kind, Collections.unmodifiableList(list));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   473
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   474
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   475
    private void computeVisibleMethods(LocalMemberTable lmt) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   476
        Set<Element> inheritedMethods = new LinkedHashSet<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   477
        Map<ExecutableElement, List<ExecutableElement>> overriddenByTable = new HashMap<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   478
        for (VisibleMemberTable pvmt : parents) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   479
            // Merge the lineage overrides into local table
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   480
            pvmt.overriddenMethodTable.entrySet().forEach(e -> {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   481
                OverridingMethodInfo p = e.getValue();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   482
                if (!p.simpleOverride) { // consider only real overrides
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   483
                    List<ExecutableElement> list = overriddenByTable.computeIfAbsent(p.overrider,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   484
                            k -> new ArrayList<>());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   485
                    list.add(e.getKey());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   486
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   487
            });
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   488
            inheritedMethods.addAll(pvmt.getAllVisibleMembers(Kind.METHODS));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   489
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   490
            // Copy the extra members (if any) from the lineage.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   491
            if (!utils.shouldDocument(pvmt.te)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   492
                List<? extends Element> extraMethods = pvmt.getExtraMembers(Kind.METHODS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   493
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   494
                if (lmt.getOrderedMembers(Kind.METHODS).isEmpty()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   495
                    inheritedMethods.addAll(extraMethods);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   496
                    continue;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   497
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   498
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   499
                // Check if an extra-method ought to percolate through.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   500
                for (Element extraMethod : extraMethods) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   501
                    boolean found = false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   502
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   503
                    List<Element> lmethods = lmt.getMembers(extraMethod, Kind.METHODS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   504
                    for (Element lmethod : lmethods) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   505
                        ExecutableElement method = (ExecutableElement)lmethod;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   506
                        found = utils.elementUtils.overrides(method,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   507
                                (ExecutableElement)extraMethod, te);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   508
                        if (found)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   509
                            break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   510
                    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   511
                    if (!found)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   512
                        inheritedMethods.add(extraMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   513
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   514
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   515
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   516
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   517
        // Filter out inherited methods that:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   518
        // a. cannot override (private instance members)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   519
        // b. are overridden and should not be visible in this type
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   520
        // c. are hidden in the type being considered
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   521
        // see allowInheritedMethods, which performs the above actions
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   522
        List<Element> list = inheritedMethods.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   523
                .filter(e -> allowInheritedMethods((ExecutableElement)e, overriddenByTable, lmt))
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   524
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   525
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   526
        // Filter out the local methods, that do not override or simply
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   527
        // overrides a super method, or those methods that should not
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   528
        // be visible.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   529
        Predicate<ExecutableElement> isVisible = m -> {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   530
            OverridingMethodInfo p = overriddenMethodTable.getOrDefault(m, null);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   531
            return p == null || !p.simpleOverride;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   532
        };
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   533
        List<Element> mlist = lmt.getOrderedMembers(Kind.METHODS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   534
        List<Element> llist = mlist.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   535
                .map(m -> (ExecutableElement)m)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   536
                .filter(isVisible)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   537
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   538
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   539
        // Merge the above lists, making sure the local methods precede
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   540
        // the others
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   541
        list.addAll(0, llist);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   542
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   543
        // Final filtration of elements
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   544
        list = list.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   545
                .filter(this::mustDocument)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   546
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   547
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   548
        visibleMembers.put(Kind.METHODS, Collections.unmodifiableList(list));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   549
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   550
        // Copy over overridden tables from the lineage, and finish up.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   551
        for (VisibleMemberTable pvmt : parents) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   552
            overriddenMethodTable.putAll(pvmt.overriddenMethodTable);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   553
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   554
        overriddenMethodTable = Collections.unmodifiableMap(overriddenMethodTable);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   555
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   556
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   557
    boolean isEnclosureInterface(Element e) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   558
        TypeElement enclosing = utils.getEnclosingTypeElement(e);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   559
        return utils.isInterface(enclosing);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   560
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   561
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   562
    boolean allowInheritedMethods(ExecutableElement inheritedMethod,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   563
                                  Map<ExecutableElement, List<ExecutableElement>> inheritedOverriddenTable,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   564
                                  LocalMemberTable lmt) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   565
        if (!isInherited(inheritedMethod))
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   566
            return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   567
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   568
        final boolean haveStatic = utils.isStatic(inheritedMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   569
        final boolean inInterface = isEnclosureInterface(inheritedMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   570
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   571
        // Static methods in interfaces are never documented.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   572
        if (haveStatic && inInterface) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   573
            return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   574
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   575
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   576
        // Multiple-Inheritance: remove the interface method that may have
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   577
        // been overridden by another interface method in the hierarchy
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   578
        //
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   579
        // Note: The following approach is very simplistic and is compatible
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   580
        // with old VMM. A future enhancement, may include a contention breaker,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   581
        // to correctly eliminate those methods that are merely definitions
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   582
        // in favor of concrete overriding methods, for instance those that have
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   583
        // API documentation and are not abstract OR default methods.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   584
        if (inInterface) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   585
            List<ExecutableElement> list = inheritedOverriddenTable.get(inheritedMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   586
            if (list != null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   587
                boolean found = list.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   588
                        .anyMatch(this::isEnclosureInterface);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   589
                if (found)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   590
                    return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   591
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   592
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   593
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   594
        Elements elementUtils = config.docEnv.getElementUtils();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   595
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   596
        // Check the local methods in this type.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   597
        List<Element> lMethods = lmt.getMembers(inheritedMethod, Kind.METHODS);
55064
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   598
        for (Element le : lMethods) {
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   599
            ExecutableElement lMethod = (ExecutableElement) le;
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   600
            // Ignore private methods or those methods marked with
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   601
            // a "hidden" tag.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   602
            if (utils.isPrivate(lMethod))
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   603
                continue;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   604
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   605
            // Remove methods that are "hidden", in JLS terms.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   606
            if (haveStatic && utils.isStatic(lMethod) &&
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   607
                    elementUtils.hides(lMethod, inheritedMethod)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   608
                return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   609
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   610
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   611
            // Check for overriding methods.
55064
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   612
            if (elementUtils.overrides(lMethod, inheritedMethod,
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   613
                    utils.getEnclosingTypeElement(lMethod))) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   614
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   615
                // Disallow package-private super methods to leak in
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   616
                TypeElement encl = utils.getEnclosingTypeElement(inheritedMethod);
58477
d148a7e7160c 8220217: Javadoc missing link to member method
hannesw
parents: 55064
diff changeset
   617
                if (utils.isUndocumentedEnclosure(encl)) {
55064
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   618
                    overriddenMethodTable.computeIfAbsent(lMethod,
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   619
                            l -> new OverridingMethodInfo(inheritedMethod, false));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   620
                    return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   621
                }
55064
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   622
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   623
                TypeMirror inheritedMethodReturn = inheritedMethod.getReturnType();
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   624
                TypeMirror lMethodReturn = lMethod.getReturnType();
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   625
                boolean covariantReturn =
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   626
                        lMethodReturn.getKind() == TypeKind.DECLARED
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   627
                        && inheritedMethodReturn.getKind() == TypeKind.DECLARED
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   628
                        && !utils.typeUtils.isSameType(lMethodReturn, inheritedMethodReturn)
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   629
                        && utils.typeUtils.isSubtype(lMethodReturn, inheritedMethodReturn);
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   630
                boolean simpleOverride = covariantReturn ? false : utils.isSimpleOverride(lMethod);
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   631
                overriddenMethodTable.computeIfAbsent(lMethod,
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   632
                        l -> new OverridingMethodInfo(inheritedMethod, simpleOverride));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   633
                return simpleOverride;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   634
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   635
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   636
        return true;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   637
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   638
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   639
    /*
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   640
     * This class encapsulates the details of local members, orderedMembers
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   641
     * contains the members in the declaration order, additionally a
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   642
     * HashMap is maintained for performance optimization to lookup
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   643
     * members. As a future enhancement is perhaps to consolidate the ordering
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   644
     * into a Map, capturing the insertion order, thereby eliminating an
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   645
     * ordered list.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   646
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   647
    class LocalMemberTable {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   648
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   649
        // Maintains declaration order
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   650
        private final Map<Kind, List<Element>> orderedMembers;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   651
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   652
        // Performance optimization
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   653
        private final Map<Kind, Map<String, List<Element>>> memberMap;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   654
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   655
        LocalMemberTable() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   656
            orderedMembers = new EnumMap<>(Kind.class);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   657
            memberMap = new EnumMap<>(Kind.class);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   658
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   659
            List<? extends Element> elements = te.getEnclosedElements();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   660
            for (Element e : elements) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   661
                if (config.nodeprecated && utils.isDeprecated(e)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   662
                    continue;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   663
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   664
                switch (e.getKind()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   665
                    case CLASS:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   666
                    case INTERFACE:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   667
                    case ENUM:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   668
                    case ANNOTATION_TYPE:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   669
                        addMember(e, Kind.INNER_CLASSES);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   670
                        break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   671
                    case FIELD:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   672
                        addMember(e, Kind.FIELDS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   673
                        addMember(e, Kind.ANNOTATION_TYPE_FIELDS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   674
                        break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   675
                    case METHOD:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   676
                        ExecutableElement ee = (ExecutableElement)e;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   677
                        if (utils.isAnnotationType(te)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   678
                            addMember(e, ee.getDefaultValue() == null
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   679
                                    ? Kind.ANNOTATION_TYPE_MEMBER_REQUIRED
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   680
                                    : Kind.ANNOTATION_TYPE_MEMBER_OPTIONAL);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   681
                        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   682
                        addMember(e, Kind.METHODS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   683
                        break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   684
                    case CONSTRUCTOR:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   685
                            addMember(e, Kind.CONSTRUCTORS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   686
                        break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   687
                    case ENUM_CONSTANT:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   688
                        addMember(e, Kind.ENUM_CONSTANTS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   689
                        break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   690
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   691
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   692
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   693
            // Freeze the data structures
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   694
            for (Kind kind : Kind.values()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   695
                orderedMembers.computeIfPresent(kind, (k, v) -> Collections.unmodifiableList(v));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   696
                orderedMembers.computeIfAbsent(kind, t -> Collections.emptyList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   697
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   698
                memberMap.computeIfPresent(kind, (k, v) -> Collections.unmodifiableMap(v));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   699
                memberMap.computeIfAbsent(kind, t -> Collections.emptyMap());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   700
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   701
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   702
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   703
        String getMemberKey(Element e) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   704
            return new SimpleElementVisitor9<String, Void>() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   705
                @Override
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   706
                public String visitExecutable(ExecutableElement e, Void aVoid) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   707
                    return e.getSimpleName() + ":" + e.getParameters().size();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   708
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   709
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   710
                @Override
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   711
                protected String defaultAction(Element e, Void aVoid) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   712
                    return e.getSimpleName().toString();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   713
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   714
            }.visit(e);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   715
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   716
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   717
        void addMember(Element e, Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   718
            List<Element> list = orderedMembers.computeIfAbsent(kind, k -> new ArrayList<>());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   719
            list.add(e);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   720
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   721
            Map<String, List<Element>> map = memberMap.computeIfAbsent(kind, k -> new HashMap<>());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   722
            list = map.computeIfAbsent(getMemberKey(e), l -> new ArrayList<>());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   723
            list.add(e);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   724
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   725
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   726
        List<Element> getOrderedMembers(Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   727
            return orderedMembers.get(kind);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   728
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   729
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   730
        List<Element> getMembers(Element e, Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   731
            String key = getMemberKey(e);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   732
            return getMembers(key, kind);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   733
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   734
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   735
        List<Element> getMembers(String key, Kind kind) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   736
            Map <String, List<Element>> map = memberMap.get(kind);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   737
            return map.getOrDefault(key, Collections.emptyList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   738
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   739
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   740
        List<Element> getPropertyMethods(String methodName, int argcount) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   741
            return getMembers(methodName + ":" + argcount, Kind.METHODS).stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   742
                    .filter(m -> (utils.isPublic(m) || utils.isProtected(m)))
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   743
                    .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   744
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   745
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   746
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   747
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   748
     * The properties triad for a property method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   749
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   750
    static class PropertyMembers {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   751
        final VariableElement field;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   752
        final ExecutableElement getter;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   753
        final ExecutableElement setter;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   754
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   755
        PropertyMembers(VariableElement field, ExecutableElement getter, ExecutableElement setter) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   756
            this.field = field;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   757
            this.getter = getter;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   758
            this.setter = setter;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   759
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   760
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   761
        public String toString() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   762
            return ("field: " + field + ", getter: " + getter + ", setter: " + setter);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   763
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   764
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   765
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   766
    /*
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   767
     * JavaFX convention notes.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   768
     * A JavaFX property-method is a method, which ends with "Property" in
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   769
     * its name, takes no parameters and typically returns a subtype of javafx.beans.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   770
     * ReadOnlyProperty, in the strictest sense. However, it may not always
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   771
     * be possible for the doclet to have access to j.b.ReadOnlyProperty,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   772
     * for this reason the strict check is disabled via an undocumented flag.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   773
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   774
     * Note, a method should not be considered as a property-method,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   775
     * if it satisfied the previously stated conditions AND if the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   776
     * method begins with "set", "get" or "is".
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   777
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   778
     * Supposing we have  {@code BooleanProperty acmeProperty()}, then the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   779
     * property-name  is "acme".
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   780
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   781
     * Property field, one may or may not exist and could be private, and
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   782
     * should match the property-method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   783
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   784
     * A property-setter is a method starting with "set", and the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   785
     * first character of the upper-cased starting character of the property name, the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   786
     * method must take 1 argument and must return a <code>void</code>.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   787
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   788
     * Using the above example {@code void setAcme(Something s)} can be
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   789
     * considered as a property-setter of the property "acme".
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   790
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   791
     * A property-getter is a method  starting with "get" and the first character
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   792
     * upper-cased property-name, having no parameters. A method that does not take any
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   793
     * parameters and starting with "is" and an upper-cased property-name,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   794
     * returning a primitive type boolean or BooleanProperty can also be
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   795
     * considered as a getter, however there must be only one getter for every property.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   796
     *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   797
     * For example {@code Object getAcme()} is a property-getter, and
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   798
     * {@code boolean isFoo()}
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   799
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   800
    private void computeVisibleProperties(LocalMemberTable lmt) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   801
        if (!config.javafx)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   802
            return;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   803
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   804
        PropertyUtils pUtils = config.propertyUtils;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   805
        List<ExecutableElement> list = visibleMembers.getOrDefault(Kind.METHODS, Collections.emptyList())
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   806
                .stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   807
                .map(m -> (ExecutableElement)m)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   808
                .filter(pUtils::isPropertyMethod)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   809
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   810
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   811
        visibleMembers.put(Kind.PROPERTIES, Collections.unmodifiableList(list));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   812
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   813
        List<ExecutableElement> propertyMethods = list.stream()
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   814
                .filter(e -> utils.getEnclosingTypeElement(e) == te)
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   815
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   816
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   817
        // Compute additional properties related sundries.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   818
        for (ExecutableElement propertyMethod : propertyMethods) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   819
            String baseName = pUtils.getBaseName(propertyMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   820
            List<Element> flist = lmt.getMembers(baseName, Kind.FIELDS);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   821
            Element field = flist.isEmpty() ? null : flist.get(0);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   822
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   823
            Element getter = null, setter = null;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   824
            List<Element> found = lmt.getPropertyMethods(pUtils.getGetName(propertyMethod), 0);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   825
            if (!found.isEmpty()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   826
                // Getters have zero params, no overloads! pick the first.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   827
                getter = found.get(0);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   828
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   829
            if (getter == null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   830
                // Check if isProperty methods are present ?
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   831
                found = lmt.getPropertyMethods(pUtils.getIsName(propertyMethod), 0);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   832
                if (!found.isEmpty()) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   833
                    String propertyTypeName = propertyMethod.getReturnType().toString();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   834
                    // Check if the return type of property method matches an isProperty method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   835
                    if (pUtils.hasIsMethod(propertyMethod)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   836
                        // Getters have zero params, no overloads!, pick the first.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   837
                        getter = found.get(0);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   838
                    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   839
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   840
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   841
            found = lmt.getPropertyMethods(pUtils.getSetName(propertyMethod), 1);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   842
            if (found != null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   843
                for (Element e : found) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   844
                    if (pUtils.isValidSetterMethod((ExecutableElement)e)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   845
                        setter = e;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   846
                        break;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   847
                    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   848
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   849
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   850
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   851
            propertyMap.put(propertyMethod, new PropertyMembers((VariableElement)field,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   852
                    (ExecutableElement)getter, (ExecutableElement)setter));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   853
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   854
            // Debugging purposes
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   855
            // System.out.println("te: " + te + ": " + utils.getEnclosingTypeElement(propertyMethod) +
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   856
            //        ":" + propertyMethod.toString() + "->" + propertyMap.get(propertyMethod));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   857
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   858
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   859
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   860
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   861
    // Future cleanups
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   862
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   863
    Map<ExecutableElement, SoftReference<ImplementedMethods>> implementMethodsFinders = new HashMap<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   864
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   865
    private ImplementedMethods getImplementedMethodsFinder(ExecutableElement method) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   866
        SoftReference<ImplementedMethods> imf = implementMethodsFinders.get(method);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   867
        // IMF does not exist or referent was gc'ed away ?
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   868
        if (imf == null || imf.get() == null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   869
            imf = new SoftReference<>(new ImplementedMethods(method));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   870
            implementMethodsFinders.put(method, imf);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   871
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   872
        return imf.get();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   873
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   874
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   875
    public List<ExecutableElement> getImplementedMethods(ExecutableElement method) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   876
        ImplementedMethods imf = getImplementedMethodsFinder(method);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   877
        return imf.getImplementedMethods().stream()
52174
8f93292c2a51 8211901: javadoc generates broken links on deprecated items page
pmuthuswamy
parents: 50672
diff changeset
   878
                .filter(m -> getSimplyOverriddenMethod(m) == null)
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   879
                .collect(Collectors.toList());
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   880
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   881
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   882
    public TypeMirror getImplementedMethodHolder(ExecutableElement method,
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   883
                                                 ExecutableElement implementedMethod) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   884
        ImplementedMethods imf = getImplementedMethodsFinder(method);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   885
        return imf.getMethodHolder(implementedMethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   886
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   887
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   888
    private class ImplementedMethods {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   889
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   890
        private final Map<ExecutableElement, TypeMirror> interfaces = new HashMap<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   891
        private final List<ExecutableElement> methlist = new ArrayList<>();
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   892
        private final TypeElement typeElement;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   893
        private final ExecutableElement method;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   894
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   895
        public ImplementedMethods(ExecutableElement method) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   896
            this.method = method;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   897
            typeElement = utils.getEnclosingTypeElement(method);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   898
            Set<TypeMirror> intfacs = utils.getAllInterfaces(typeElement);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   899
            /*
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   900
             * Search for the method in the list of interfaces. If found check if it is
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   901
             * overridden by any other subinterface method which this class
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   902
             * implements. If it is not overidden, add it in the method list.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   903
             * Do this recursively for all the extended interfaces for each interface
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   904
             * from the list.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   905
             */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   906
            for (TypeMirror interfaceType : intfacs) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   907
                ExecutableElement found = utils.findMethod(utils.asTypeElement(interfaceType), method);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   908
                if (found != null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   909
                    removeOverriddenMethod(found);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   910
                    if (!overridingMethodFound(found)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   911
                        methlist.add(found);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   912
                        interfaces.put(found, interfaceType);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   913
                    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   914
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   915
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   916
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   917
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   918
        /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   919
         * Return the list of interface methods which the method passed in the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   920
         * constructor is implementing. The search/build order is as follows:
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   921
         * <pre>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   922
         * 1. Search in all the immediate interfaces which this method's class is
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   923
         *    implementing. Do it recursively for the superinterfaces as well.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   924
         * 2. Traverse all the superclasses and search recursively in the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   925
         *    interfaces which those superclasses implement.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   926
         *</pre>
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   927
         *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   928
         * @return SortedSet<ExecutableElement> of implemented methods.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   929
         */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   930
        List<ExecutableElement> getImplementedMethods() {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   931
            return methlist;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   932
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   933
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   934
        TypeMirror getMethodHolder(ExecutableElement ee) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   935
            return interfaces.get(ee);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   936
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   937
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   938
        /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   939
         * Search in the method list and check if it contains a method which
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   940
         * is overridden by the method as parameter.  If found, remove the
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   941
         * overridden method from the method list.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   942
         *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   943
         * @param method Is this method overriding a method in the method list.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   944
         */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   945
        private void removeOverriddenMethod(ExecutableElement method) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   946
            TypeElement overriddenClass = utils.overriddenClass(method);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   947
            if (overriddenClass != null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   948
                for (int i = 0; i < methlist.size(); i++) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   949
                    TypeElement te = utils.getEnclosingTypeElement(methlist.get(i));
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   950
                    if (te == overriddenClass || utils.isSubclassOf(overriddenClass, te)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   951
                        methlist.remove(i);  // remove overridden method
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   952
                        return;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   953
                    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   954
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   955
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   956
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   957
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   958
        /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   959
         * Search in the already found methods' list and check if it contains
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   960
         * a method which is overriding the method parameter or is the method
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   961
         * parameter itself.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   962
         *
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   963
         * @param method method to be searched
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   964
         */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   965
        private boolean overridingMethodFound(ExecutableElement method) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   966
            TypeElement containingClass = utils.getEnclosingTypeElement(method);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   967
            for (ExecutableElement listmethod : methlist) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   968
                if (containingClass == utils.getEnclosingTypeElement(listmethod)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   969
                    // it's the same method.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   970
                    return true;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   971
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   972
                TypeElement te = utils.overriddenClass(listmethod);
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   973
                if (te == null) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   974
                    continue;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   975
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   976
                if (te == containingClass || utils.isSubclassOf(te, containingClass)) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   977
                    return true;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   978
                }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   979
            }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   980
            return false;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   981
        }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   982
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   983
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   984
    /**
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   985
     * A simple container to encapsulate an overriding method
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   986
     * and the type of override.
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   987
     */
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   988
    static class OverridingMethodInfo {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   989
        final ExecutableElement overrider;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   990
        final boolean simpleOverride;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   991
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   992
        public OverridingMethodInfo(ExecutableElement overrider, boolean simpleOverride) {
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   993
            this.overrider = overrider;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   994
            this.simpleOverride = simpleOverride;
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
   995
        }
55064
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   996
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   997
        @Override
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   998
        public String toString() {
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
   999
            return "OverridingMethodInfo[" + overrider + ",simple:" + simpleOverride + "]";
cb35ce1770a0 8219147: Javadoc should expose covariant return type overrides
jjg
parents: 52174
diff changeset
  1000
        }
49879
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
  1001
    }
601277b1d582 8025091: VisibleMemberMap.java possible performance improvements
ksrini
parents:
diff changeset
  1002
}