public FullyQualifiedJavadocReference resolveReference()

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);
    }