in maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/converter/JavaClassConverterContext.java [187:268]
public FullyQualifiedJavadocReference resolveReference(JavadocReference reference) {
Optional<FullyQualifiedJavadocReference> resolvedName;
// is it already fully qualified?
if (reference.getPackageNameClassName().isPresent()) {
resolvedName = resolveMember(
reference.getPackageNameClassName().get(), reference.getMember(), reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
}
// is it a member only?
if (reference.getMember().isPresent()
&& !reference.getPackageNameClassName().isPresent()) {
// search order for not fully qualified names:
// 1. The current class or interface (only for members)
resolvedName = resolveMember(declaringClass, reference.getMember(), reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
// 2. Any enclosing classes and interfaces searching the closest first (only members)
for (JavaClass nestedClass : declaringClass.getNestedClasses()) {
resolvedName = resolveMember(nestedClass, reference.getMember(), reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
}
// 3. Any superclasses and superinterfaces, searching the closest first. (only members)
JavaClass superClass = declaringClass.getSuperJavaClass();
while (superClass != null) {
resolvedName = resolveMember(superClass, reference.getMember(), reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
superClass = superClass.getSuperJavaClass();
}
} else {
String packageNameClassName = reference.getPackageNameClassName().get();
// 4. The current package
resolvedName = resolveMember(
declaringClass.getPackageName() + "." + packageNameClassName,
reference.getMember(),
reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
// 5. Any imported packages, classes, and interfaces, searching in the order of the import statement.
List<String> importNames = new ArrayList<>();
importNames.add("java.lang.*"); // default import
importNames.addAll(declaringClass.getSource().getImports());
for (String importName : importNames) {
if (importName.endsWith(".*")) {
resolvedName = resolveMember(
importName.replace("*", packageNameClassName), reference.getMember(), reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
} else {
if (importName.endsWith(packageNameClassName)) {
resolvedName = resolveMember(importName, reference.getMember(), reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
} else {
// ends with prefix of reference (nested class name)
int firstDotIndex = packageNameClassName.indexOf(".");
if (firstDotIndex > 0
&& importName.endsWith(packageNameClassName.substring(0, firstDotIndex))) {
resolvedName = resolveMember(
importName,
packageNameClassName.substring(firstDotIndex + 1),
reference.getMember(),
reference.getLabel());
if (resolvedName.isPresent()) {
return resolvedName.get();
}
}
}
}
}
}
throw new IllegalArgumentException("Could not resolve javadoc reference " + reference);
}