简体   繁体   中英

Annotation Processor Links to a file

I did make my custom annotation processor class, and it's working fine, but I would like to print a message when raise an error, and add the link of file where raise that error.

        if(baseUrl.isEmpty()) {
            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Note: The url field must not be empty, {@link Endpoints.java:9}");
        }

How can I print the url like this 在此处输入图像描述

You can find the top-level class which encloses the annoated element, derive the file name and package name from it, and pass them to Filter.getResource . The returned FileObject can be converted to a URI with its toUri() method.

if (baseUrl.isEmpty()) {
    String filename = null;
    String packageName = null;

    Element owner = element;
    do {
        if (owner instanceof TypeElement type
            && type.getNestingKind() == NestingKind.TOP_LEVEL) {

            filename = type.getSimpleName() + ".java";

            PackageElement pkg =
                processingEnv.getElementUtils().getPackageOf(type);
            packageName = pkg.getQualifiedName().toString();

            ModuleElement mod =
                processingEnv.getElementUtils().getModuleOf(type);
            if (mod != null && !mod.isUnnamed()) {
                packageName = mod.getQualifiedName() + "/" + packageName;
            }

            break;
        }

        owner = owner.getEnclosingElement();
    } while (owner != null);
        
    String fileLocation = "(file unknown)";
    if (filename != null && packageName != null) {
        try {
            FileObject file = processingEnv.getFiler().getResource(
                StandardLocation.CLASS_PATH, packageName, filename);
            fileLocation = file.toUri().toString();
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
        "Note: The url field must not be empty, " + fileLocation, element);
}

The above code assumes element is an Element returned by RoundEnvironment.getElementsAnnotatedWith (or RoundEnvironment.getElementsAnnotatedWithAny).

Your image shows an absolute file path, not a URL. If you really wanted a file path, not a URL, it's easy enough to obtain one instead of a URI:

Path path = Paths.get(file.getName());
fileLocation = path.toAbsolutePath().toString();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM