diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
index 98e1a8c17a6..74c224e777e 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
@@ -354,7 +354,7 @@ protected class DeltaListener implements IElementChangedListener, IResourceChang
* #startDeltas
and
* #stopDeltas
.
*/
- private IJavaElementDelta[] deltas;
+ private ArrayList deltas = new ArrayList<>();
private final int eventType;
@@ -373,10 +373,7 @@ public DeltaListener(int eventType) {
public synchronized void elementChanged(ElementChangedEvent event) {
if (this.eventType == -1 || event.getType() == this.eventType) {
- IJavaElementDelta[] copy= new IJavaElementDelta[this.deltas.length + 1];
- System.arraycopy(this.deltas, 0, copy, 0, this.deltas.length);
- copy[this.deltas.length]= event.getDelta();
- this.deltas= copy;
+ this.deltas.add(event.getDelta());
StringBuilder message = new StringBuilder();
Job currentJob = Job.getJobManager().currentJob();
if (currentJob != null) {
@@ -389,8 +386,8 @@ public synchronized void elementChanged(ElementChangedEvent event) {
}
}
public synchronized CompilationUnit getCompilationUnitAST(ICompilationUnit workingCopy) {
- for (int i=0, length= this.deltas.length; i getAllDeltas() {
- return List.of(this.deltas);
+ return this.deltas;
}
public synchronized void flush() {
- this.deltas = new IJavaElementDelta[0];
+ this.deltas.clear();
this.stackTraces = new ByteArrayOutputStream();
this.gotResourceDelta = false;
}
@@ -512,8 +509,7 @@ public synchronized String stackTraces() {
@Override
public synchronized String toString() {
StringBuilder buffer = new StringBuilder();
- for (int i = 0, length= this.deltas.length; i < length; i++) {
- IJavaElementDelta delta = this.deltas[i];
+ for (IJavaElementDelta delta: this.deltas) {
if (((JavaElementDelta) delta).ignoreFromTests) {
continue;
}
@@ -1607,6 +1603,14 @@ public void clearDeltas(DeltaListener listener) {
listener.flush();
}
public void clearDeltas() {
+ // We must join on the auto-refresh family because the workspace changes done in the
+ // tests may be batched and broadcasted by the RefreshJob, not the main thread.
+ Job.getJobManager().wakeUp(ResourcesPlugin.FAMILY_AUTO_REFRESH);
+ try {
+ Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, null);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
this.deltaListener.flush();
}
protected IJavaElement[] codeSelect(ISourceReference sourceReference, String selectAt, String selection) throws JavaModelException {