AbstractProcessor能否检测带注释的方法是否存在编译错误?

问题描述 投票:0回答:1

我的AbstractProcessor实现被调用,即使带注释的方法包含导致编译器错误的代码。 (即,处理器以目标为ElementType.METHOD的注释的存在为触发)。

经过一些实验,我给人的印象是,方法主体中的语法错误导致未触发AbstractProcessor,而fx试图调用无法访问的私有方法的“引用错误”确实导致AbstractProcessor被呼叫。

我很高兴能调用AbstractProcessor,但我需要知道带注释的方法是否包含任何错误。

我有两个问题:

  1. 如果找到我的方法的ExecutableElement,我的AbstractProcessor代码如何知道包含错误?我知道Google Auto的SuperficialValidation,但无法检测到这些错误-也许它仅适用于TypeElements?
  2. 我是否可以确定所有编译器版本在处理各种错误方面都具有相同的行为,从而阻止了AbstractProcessor的调用,而哪些将让它执行其逻辑?
java compiler-errors annotation-processing
1个回答
1
投票

JavaCompiler具有多个运行阶段。您可以从RoundEnvironment.processingOver()中查看处理是否完成,然后使用TreePathScanner在树上行走。但是,在批注处理完成之后会发现许多实际错误,并且可以在诊断程序中找到它们。您可能可以通过提供DiagnosticListener来找到一些信息。

有一些方法可以通过检查符号的Symbol/Type来检测是否已发生错误。在TreePathScanner内使用visitMethodInvocatio,您会期望该符号是一个方法,但是如果该方法不存在,则它可能为null或ClassSymbol

© www.soinside.com 2019 - 2024. All rights reserved.