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 {