Reputation: 341
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
Upvotes: 1
Views: 333
Reputation: 44308
You can find the top-level class which encloses the annotated element, derive the file name and package name from it, and pass them to Filer.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();
Upvotes: 2