44import com .microsoft .lookup .ClassItemsLookup ;
55import com .microsoft .lookup .ClassLookup ;
66import com .microsoft .lookup .PackageLookup ;
7- import com .microsoft .model .MetadataFile ;
8- import com .microsoft .model .MetadataFileItem ;
9- import com .microsoft .model .SpecViewModel ;
10- import com .microsoft .model .TocFile ;
11- import com .microsoft .model .TocItem ;
7+ import com .microsoft .model .*;
128import com .microsoft .util .ElementUtil ;
139import com .microsoft .util .FileUtil ;
1410import com .microsoft .util .YamlUtil ;
11+ import jdk .javadoc .doclet .DocletEnvironment ;
12+ import org .apache .commons .lang3 .RegExUtils ;
13+ import org .apache .commons .lang3 .StringUtils ;
1514
16- import java .util .ArrayList ;
17- import java .util .Arrays ;
18- import java .util .Iterator ;
19- import java .util .LinkedHashSet ;
20- import java .util .List ;
21- import java .util .Objects ;
22- import java .util .Optional ;
23- import java .util .Set ;
15+ import javax .lang .model .element .*;
16+ import javax .lang .model .util .ElementFilter ;
17+ import java .util .*;
2418import java .util .function .Function ;
2519import java .util .regex .Matcher ;
2620import java .util .regex .Pattern ;
2721import java .util .stream .Collectors ;
2822import java .util .stream .Stream ;
29- import javax .lang .model .element .Element ;
30- import javax .lang .model .element .ExecutableElement ;
31- import javax .lang .model .element .Modifier ;
32- import javax .lang .model .element .PackageElement ;
33- import javax .lang .model .element .TypeElement ;
34- import javax .lang .model .util .ElementFilter ;
35-
36- import jdk .javadoc .doclet .DocletEnvironment ;
37-
38- import org .apache .commons .lang3 .RegExUtils ;
39- import org .apache .commons .lang3 .StringUtils ;
4023
4124
4225public class YmlFilesBuilder {
4326
4427 private final static String [] LANGS = {"java" };
4528 private final Pattern XREF_LINK_PATTERN = Pattern .compile ("<xref uid=\" .*?\" .*?>.*?</xref>" );
4629 private final Pattern XREF_LINK_CONTENT_PATTERN = Pattern .compile ("(?<=<xref uid=\" ).*?(?=\" .*?>.*?</xref>)" );
30+ private final Pattern XREF_LINK_RESOLVE_PATTERN = Pattern .compile ("(?<class>\\ w+)\\ #(?<member>\\ w+)(\\ ((?<param>.*)\\ ))?" );
4731
4832 private DocletEnvironment environment ;
4933 private String outputPath ;
@@ -182,7 +166,7 @@ void addChildren(TypeElement classElement, List<String> children) {
182166
183167 List <? extends Element > filterPrivateElements (List <? extends Element > elements ) {
184168 return elements .stream ()
185- .filter (element -> !element . getModifiers (). contains ( Modifier . PRIVATE )).collect (Collectors .toList ());
169+ .filter (element -> !ElementUtil . isPrivateOrPackagePrivate ( element )).collect (Collectors .toList ());
186170 }
187171
188172 void collect (TypeElement classElement , List <String > children ,
@@ -209,7 +193,7 @@ void addConstructorsInfo(TypeElement classElement, MetadataFile classMetadataFil
209193
210194 void addMethodsInfo (TypeElement classElement , MetadataFile classMetadataFile ) {
211195 ElementFilter .methodsIn (classElement .getEnclosedElements ()).stream ()
212- .filter (methodElement -> !methodElement . getModifiers (). contains ( Modifier . PRIVATE ))
196+ .filter (methodElement -> !ElementUtil . isPrivateOrPackagePrivate ( methodElement ))
213197 .forEach (methodElement -> {
214198 MetadataFileItem methodItem = buildMetadataFileItem (methodElement );
215199 methodItem .setOverload (classItemsLookup .extractOverload (methodElement ));
@@ -228,7 +212,7 @@ void addMethodsInfo(TypeElement classElement, MetadataFile classMetadataFile) {
228212
229213 void addFieldsInfo (TypeElement classElement , MetadataFile classMetadataFile ) {
230214 ElementFilter .fieldsIn (classElement .getEnclosedElements ()).stream ()
231- .filter (fieldElement -> !fieldElement . getModifiers (). contains ( Modifier . PRIVATE ))
215+ .filter (fieldElement -> !ElementUtil . isPrivateOrPackagePrivate ( fieldElement ))
232216 .forEach (fieldElement -> {
233217 MetadataFileItem fieldItem = buildMetadataFileItem (fieldElement );
234218 fieldItem .setContent (classItemsLookup .extractFieldContent (fieldElement ));
@@ -392,25 +376,40 @@ String populateUidValues(String text, LookupContext lookupContext) {
392376 }
393377
394378 String linkContent = linkContentMatcher .group ();
395- String uid = resolveUidByLookup (linkContent , lookupContext );
379+ String uid = resolveUidFromLinkContent (linkContent , lookupContext );
396380 String updatedLink = linkContentMatcher .replaceAll (uid );
397381 text = StringUtils .replace (text , link , updatedLink );
398382 }
399383 return text ;
400384 }
401385
402- String resolveUidByLookup (String linkContent , LookupContext lookupContext ) {
386+ /**
387+ * The linkContent could be in following format
388+ * #memeber
389+ * Class#member
390+ * Class#method()
391+ * Class#method(params)
392+ */
393+ String resolveUidFromLinkContent (String linkContent , LookupContext lookupContext ) {
403394 if (StringUtils .isBlank (linkContent )) {
404395 return "" ;
405396 }
406397
407398 linkContent = linkContent .trim ();
399+
400+ // complete class name for class internal link
408401 if (linkContent .startsWith ("#" )) {
409402 String firstKey = lookupContext .getOwnerUid ();
410403 linkContent = firstKey + linkContent ;
411404 }
405+
406+ // fuzzy resolve, target for items from project external references
407+ String fuzzyResolvedUid = resolveUidFromReference (linkContent , lookupContext );
408+
409+ // exact resolve in lookupContext
412410 linkContent = linkContent .replace ("#" , "." );
413- return lookupContext .containsKey (linkContent ) ? lookupContext .resolve (linkContent ) : "" ;
411+ String exactResolveUid = resolveUidByLookup (linkContent , lookupContext );
412+ return exactResolveUid .isEmpty () ? fuzzyResolvedUid : exactResolveUid ;
414413 }
415414
416415 List <String > splitUidWithGenericsIntoClassNames (String uid ) {
@@ -464,4 +463,35 @@ else if (uid != "")
464463
465464 return specList ;
466465 }
466+
467+ /**
468+ * this method is used to do fuzzy resolve
469+ * "*" will be added at the end of uid for method for xerf service resolve purpose
470+ */
471+ String resolveUidFromReference (String linkContent , LookupContext lookupContext ) {
472+ String uid = "" ;
473+ Matcher matcher = XREF_LINK_RESOLVE_PATTERN .matcher (linkContent );
474+
475+ if (matcher .find ()) {
476+ String className = matcher .group ("class" );
477+ String memberName = matcher .group ("member" );
478+ uid = resolveUidByLookup (className , lookupContext );
479+ if (!uid .isEmpty ()) {
480+ uid = uid .concat ("." ).concat (memberName );
481+
482+ // linkContent targets a method
483+ if (!StringUtils .isBlank (matcher .group (3 ))) {
484+ uid = uid .concat ("*" );
485+ }
486+ }
487+ }
488+ return uid ;
489+ }
490+
491+ String resolveUidByLookup (String signature , LookupContext lookupContext ){
492+ if (StringUtils .isBlank (signature ) || lookupContext == null ) {
493+ return "" ;
494+ }
495+ return lookupContext .containsKey (signature ) ? lookupContext .resolve (signature ) : "" ;
496+ }
467497}
0 commit comments