如何检测eclipse编译错误(Java - JDT)

时间:2009-11-04 00:54:40

标签: java eclipse-plugin eclipse-rcp eclipse-jdt compiler-errors

我需要在POST_CHANGE事件之后检测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 个答案:

答案 0 :(得分:0)

还有一种替代方式。将IDocumentListener添加到当前的Java编辑器中,每当文档更改时重新创建ICompilationUnit。我认为它应该有效。 或者您也可以尝试通过FileBuffers.getTextFileBufferManager().addFileBufferListener()添加BufferListener,以便您可以更好地控制何时需要更新ICompilationUnit。