1010import javax .lang .model .util .SimpleElementVisitor9 ;
1111import javax .lang .model .util .Types ;
1212
13- import java .util .ArrayList ;
14- import java .util .Collections ;
15- import java .util .List ;
16- import java .util .Optional ;
13+ import java .util .*;
1714import java .util .stream .Collectors ;
1815
1916import jdk .javadoc .doclet .DocletEnvironment ;
@@ -77,6 +74,21 @@ public boolean isSimpleOverride(ExecutableElement m) {
7774 (fullBody .size () == 1 && fullBody .get (0 ).getKind ().equals (DocTree .Kind .INHERIT_DOC ));
7875 }
7976
77+ public boolean hasInlineTag (List <? extends DocTree > inlineTags , DocTree .Kind kind ) {
78+ for (DocTree dt : inlineTags ) {
79+ if (dt .getKind () == kind ) {
80+ return true ;
81+ }
82+ }
83+ return false ;
84+ }
85+
86+ public Element getMemberBySignature (TypeElement te , ElementKind kind , String signature ) {
87+ return getMembers (te , kind ).stream ()
88+ .filter (e -> e .toString ().equals (signature ))
89+ .findFirst ().orElse (null );
90+ }
91+
8092 public TypeElement getObjectType () {
8193 return elementUtils .getTypeElement ("java.lang.Object" );
8294 }
@@ -193,6 +205,12 @@ public List<? extends DocTree> getBlockTags(Element element) {
193205 return getBlockTags0 (element , (DocTree .Kind []) null );
194206 }
195207
208+ public List <? extends DocTree > removeBlockTag (List <? extends DocTree > dctree , DocTree .Kind kind ) {
209+ return dctree .stream ()
210+ .filter (dc -> !dc .getKind ().equals (kind ))
211+ .collect (Collectors .toList ());
212+ }
213+
196214 /**
197215 * Returns a list of visible enclosed members of given kind,
198216 * declared in this type element, and does not include
@@ -205,4 +223,39 @@ public List<? extends Element> getMembers(TypeElement te, ElementKind kind) {
205223 .filter (e -> e .getKind () == kind && !isPrivateOrPackagePrivate (e ))
206224 .collect (Collectors .toList ());
207225 }
226+
227+ /**
228+ * Returns a list of methods being implemented by given method.
229+ * When a method in an interface overrides a method its superinterface,
230+ * it will be considered as "implemented", instead of "overridden".
231+ *
232+ * @return a list of implemented methods
233+ */
234+ public List <Element > getImplementedMethods (String signature , TypeElement encl , List <Element > implementedMethods ) {
235+ if (encl == null ) {
236+ return implementedMethods ;
237+ }
238+
239+ for (TypeElement interfaceType : getImplementedInterfaces (encl )) {
240+ Element implementedMethod = getMemberBySignature (interfaceType , ElementKind .METHOD , signature );
241+ if (implementedMethod != null ) {
242+ implementedMethods .add (implementedMethod );
243+ }
244+ // We need to search every implemented interface of the Inheritance chain.
245+ getImplementedMethods (signature , interfaceType , implementedMethods );
246+ }
247+ return implementedMethods ;
248+ }
249+
250+ /**
251+ * Returns a list of implemented interface type elements of given type element.
252+ * Follow Standard doclet, search in the order of appearance following the word implements in declaration.
253+ *
254+ * @return a list of implemented interfaces
255+ */
256+ public List <TypeElement > getImplementedInterfaces (TypeElement element ) {
257+ return element .getInterfaces ().stream ()
258+ .map (e -> asTypeElement (e ))
259+ .collect (Collectors .toList ());
260+ }
208261}
0 commit comments