11package com .microsoft .lookup ;
22
33import com .microsoft .lookup .model .ExtendedMetadataFileItem ;
4+
45import com .microsoft .model .ExceptionItem ;
56import com .microsoft .model .MethodParameter ;
67import com .microsoft .model .Return ;
8+
9+ import com .microsoft .util .CommentHelper ;
10+ import com .microsoft .util .Utils ;
11+
12+ import com .sun .source .doctree .DocTree ;
713import com .sun .source .doctree .DocTree .Kind ;
814import com .sun .source .doctree .ParamTree ;
915import com .sun .source .doctree .ReturnTree ;
1016import com .sun .source .doctree .ThrowsTree ;
17+
18+ import java .util .ArrayList ;
1119import java .util .List ;
1220import java .util .stream .Collectors ;
13- import javax .lang .model .element .Element ;
14- import javax .lang .model .element .ExecutableElement ;
15- import javax .lang .model .element .TypeElement ;
16- import javax .lang .model .element .VariableElement ;
21+
22+ import javax .lang .model .element .*;
1723import javax .lang .model .type .TypeKind ;
24+
1825import jdk .javadoc .doclet .DocletEnvironment ;
1926
2027public class ClassItemsLookup extends BaseLookup <Element > {
28+ private Utils utils ;
2129
2230 public ClassItemsLookup (DocletEnvironment environment ) {
2331 super (environment );
32+ utils = new Utils (environment );
2433 }
2534
2635 @ Override
@@ -48,18 +57,22 @@ protected ExtendedMetadataFileItem buildMetadataFileItem(Element element) {
4857 ExecutableElement exeElement = (ExecutableElement ) element ;
4958 List <MethodParameter > parameters = extractParameters (exeElement );
5059 String paramsString = parameters .stream ()
51- .map (parameter -> String .format ("%s %s" , makeTypeShort (parameter .getType ()), parameter .getId ()))
52- .collect (Collectors .joining (", " ));
60+ .map (parameter -> String .format ("%s %s" , makeTypeShort (parameter .getType ()), parameter .getId ()))
61+ .collect (Collectors .joining (", " ));
5362 String nameWithoutBrackets = elementQName .replaceAll ("\\ (.*\\ )" , "" );
5463 String methodName = String .format ("%s(%s)" , nameWithoutBrackets , paramsString );
5564
5665 result .setName (methodName );
5766 result .setMethodContent (String .format ("%s %s %s" , modifiers ,
58- makeTypeShort (String .valueOf (exeElement .getReturnType ())), result .getName ()));
67+ makeTypeShort (String .valueOf (exeElement .getReturnType ())), result .getName ()));
5968 result .setConstructorContent (String .format ("%s %s" , modifiers , result .getName ()));
6069 result .setParameters (parameters );
6170 result .setExceptions (extractExceptions (exeElement ));
6271 result .setReturn (extractReturn (exeElement ));
72+ if (exeElement .getKind () == ElementKind .METHOD ) {
73+ result .setOverridden (extractOverriddenUid (utils .overriddenMethod (exeElement )));
74+ result .setSummary (getInheritedInlineCommentString (exeElement ));
75+ }
6376 }
6477 result .setNameWithType (String .format ("%s.%s" , classSNameWithGenericsSupport , result .getName ()));
6578 result .setFullName (String .format ("%s.%s" , classQNameWithGenericsSupport , result .getName ()));
@@ -83,11 +96,11 @@ List<MethodParameter> extractParameters(ExecutableElement element) {
8396
8497 String extractParameterDescription (ExecutableElement method , String paramName ) {
8598 return getDocCommentTree (method ).map (docTree -> docTree .getBlockTags ().stream ()
86- .filter (o -> o .getKind () == Kind .PARAM )
87- .map (o -> (ParamTree ) o )
88- .filter (o -> paramName .equals (String .valueOf (o .getName ())))
89- .map (o -> replaceLinksAndCodes (o .getDescription ()))
90- .findFirst ().orElse (null )
99+ .filter (o -> o .getKind () == Kind .PARAM )
100+ .map (o -> (ParamTree ) o )
101+ .filter (o -> paramName .equals (String .valueOf (o .getName ())))
102+ .map (o -> replaceLinksAndCodes (o .getDescription ()))
103+ .findFirst ().orElse (null )
91104 ).orElse (null );
92105 }
93106
@@ -100,10 +113,10 @@ List<ExceptionItem> extractExceptions(ExecutableElement methodElement) {
100113
101114 String extractExceptionDescription (ExecutableElement methodElement ) {
102115 return getDocCommentTree (methodElement ).map (docTree -> docTree .getBlockTags ().stream ()
103- .filter (o -> o .getKind () == Kind .THROWS )
104- .map (o -> (ThrowsTree ) o )
105- .map (o -> replaceLinksAndCodes (o .getDescription ()))
106- .findFirst ().orElse (null )
116+ .filter (o -> o .getKind () == Kind .THROWS )
117+ .map (o -> (ThrowsTree ) o )
118+ .map (o -> replaceLinksAndCodes (o .getDescription ()))
119+ .findFirst ().orElse (null )
107120 ).orElse (null );
108121 }
109122
@@ -116,10 +129,10 @@ Return extractReturn(ExecutableElement methodElement) {
116129
117130 String extractReturnDescription (ExecutableElement methodElement ) {
118131 return getDocCommentTree (methodElement ).map (docTree -> docTree .getBlockTags ().stream ()
119- .filter (o -> o .getKind () == Kind .RETURN )
120- .map (o -> (ReturnTree )o )
121- .map (o -> replaceLinksAndCodes (o .getDescription ()))
122- .findFirst ().orElse (null )
132+ .filter (o -> o .getKind () == Kind .RETURN )
133+ .map (o -> (ReturnTree ) o )
134+ .map (o -> replaceLinksAndCodes (o .getDescription ()))
135+ .findFirst ().orElse (null )
123136 ).orElse (null );
124137 }
125138
@@ -130,4 +143,56 @@ Return extractReturn(VariableElement fieldElement) {
130143 String convertFullNameToOverload (String fullName ) {
131144 return fullName .replaceAll ("\\ (.*\\ )" , "*" );
132145 }
146+
147+ String extractOverriddenUid (ExecutableElement ovr ) {
148+ if (ovr != null ) {
149+ TypeElement te = utils .getEnclosingTypeElement (ovr );
150+ String uid = te .getQualifiedName ().toString ().concat ("." ) + String .valueOf (ovr );
151+ return uid ;
152+ }
153+
154+ return "" ;
155+ }
156+
157+ /**
158+ * If the item being inherited from is declared from external compiled package,
159+ * or is declared in the packages like java.lang.Object,
160+ * comments may be not available as doclet resolves from byte code.
161+ */
162+ String getInheritedInlineCommentString (ExecutableElement exeElement ) {
163+ CommentHelper ch = getInheritedInlineTags (new CommentHelper (exeElement , utils ));
164+ // Remove unresolved "@inheritDoc" tag.
165+ List <? extends DocTree > dctree = utils .removeBlockTag (ch .inlineTags , DocTree .Kind .INHERIT_DOC );
166+ return replaceLinksAndCodes (dctree );
167+ }
168+
169+ CommentHelper getInheritedInlineTags (CommentHelper input ) {
170+ CommentHelper output = input .copy ();
171+ if (!output .hasInheritDocTag ()&& !output .isSimpleOverride ()) {
172+ return output ;
173+ }
174+
175+ CommentHelper inheritedSearchInput = input .copy ();
176+ ExecutableElement overriddenMethod = utils .overriddenMethod ((ExecutableElement ) input .element );
177+
178+ if (overriddenMethod != null ) {
179+ inheritedSearchInput .element = overriddenMethod ;
180+ CommentHelper ch = getInheritedInlineTags (inheritedSearchInput );
181+ if (!ch .isSimpleOverride ()) {
182+ output = output .inherit (ch );
183+ }
184+ }
185+
186+ TypeElement encl = utils .getEnclosingTypeElement (input .element );
187+ List <Element > implementedMethods = utils .getImplementedMethods (input .element .toString (), encl , new ArrayList <Element >());
188+ for (Element implementedMethod : implementedMethods ) {
189+ inheritedSearchInput .element = implementedMethod ;
190+ CommentHelper ch = getInheritedInlineTags (inheritedSearchInput );
191+ if (!ch .isSimpleOverride ()) {
192+ output = output .inherit (ch );
193+ }
194+ }
195+
196+ return output ;
197+ }
133198}
0 commit comments