我需要在post\u更改事件之后检测java源代码中的编译错误(通常在保存java文件中的更改之后触发)。我用ielementchangedlistener来做这个。因此,为了检测错误,我尝试了以下两种可能性:
1:
boolean error = IMarker.SEVERITY_ERROR == iFile.findMaxProblemSeverity(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
2:
ICompilationUnit unit = ..; // get some compilation unit
// create requestor for accumulating discovered problems
IProblemRequestor problemRequestor = new IProblemRequestor() {
public void acceptProblem(IProblem problem) {
System.out.println(problem.getID() + ": " + problem.getMessage());
}
public void beginReporting() {}
public void endReporting() {}
public boolean isActive() { return true; } // will detect problems if active
};
// use working copy to hold source with error
unit.getWorkingCopy(new WorkingCopyOwner() {}, problemRequestor, null);
第一种解决方案不起作用,因为我可以得到的错误来自以前的状态,即保存前的状态。它不反映当前的源代码,因此是不可靠的。
第二种解决方案适用于大多数情况。保存java文件后,我可以检测该文件中存在的所有错误。但是,如果执行svn更新,则此解决方案在合并后无法检测到错误。基本上,我能发现的是,当我收到事件通知时,icompilationunit显示文件的我的版本,而不是显示新的合并版本。奇怪的是ifile对象已经有了所有的更改(合并的文件),即使我从ifile对象创建了一个icompilationunit对象,它似乎指向了我的icompilationunit版本的表示。
有人能给我一些建议吗?
谢谢,蒂亚戈
1条答案
按热度按时间0s0u357o1#
还有另外一种方法。添加
IDocumentListener
到您当前的java编辑器,并且每当文档发生更改时,重新创建您的ICompilationUnit
. 我觉得应该有用。或者也可以尝试通过FileBuffers.getTextFileBufferManager().addFileBufferListener()
这样您就可以在需要更新icompilationunit时拥有更多的控制权。