1
我写了一个插件,对传统代码进行一些批量更改。这些更改通过ICompilationUnits
的集合循环完成,并逐个处理。多次运行,可能会再次更改相同的编译单元。如何避免“org.eclipse.jdt.core.JavaModelException:更新冲突”
该命令工作正常,如果第一次运行。之后,当我再次运行命令时,我得到一个JavaModelException
。
org.eclipse.jdt.core.JavaModelException: Update conflict
at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:784) ~[na:na]
at org.eclipse.jdt.internal.core.CompilationUnit.commitWorkingCopy(CompilationUnit.java:391) ~[na:na]
...
我该怎么做才能避免这种异常?我处理代码更改的代码如下所示:
public void process(ICompilationUnit cu, SubMonitor monitor) throws CoreException {
monitor.setWorkRemaining(7);
try {
cu.becomeWorkingCopy(monitor.newChild(1));
CompilationUnit unit = EclipseUtil.parseAst(cu, monitor.newChild(1));
ASTRewrite rewrite = ASTRewrite.create(unit.getAST());
ImportRewrite importRewrite = ImportRewrite.create(unit, true);
// Do the Work
processSearchResults(unit, rewrite, importRewrite, monitor.newChild(1));
cu.applyTextEdit(rewrite.rewriteAST(), monitor.newChild());
TextEdit importEdit = importRewrite.rewriteImports(monitor.newChild(1));
cu.applyTextEdit(importEdit, monitor.newChild(1));
if (monitor.isCanceled())
cu.discardWorkingCopy();
else
cu.commitWorkingCopy(false, monitor.newChild(1));
} catch (Exception e) {
cu.discardWorkingCopy();
throw e;
} finally {
monitor.done();
}
}
所有实例都是新鲜阅读的。插件本身不会缓存任何东西。有没有我忘记做的事情,比如刷新或关闭资源?也许单位AST本身?在CommitWorkingCopyOperation.verify
产生
嗨格雷格,感谢您的意见。我怎样才能确保编译单元得到“刷新”?我看到ICompilationUnit.reconcile(...),但这似乎是别的东西。 –