From 77279721996247b86e1106f4eac907ed48a3f7f4 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Fri, 19 Jan 2024 15:15:58 +0100 Subject: [PATCH] avoid busy and possibly infinite loop in JavaEditorExtension Maybe due to a bug in Platform not correctly closing or saving editors. --- .../tests/builder/JavaEditorExtension.xtend | 11 ++- .../tests/builder/JavaEditorExtension.java | 97 ++++++++++++------- 2 files changed, 70 insertions(+), 38 deletions(-) diff --git a/org.eclipse.xtend.ide.tests/src/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.xtend b/org.eclipse.xtend.ide.tests/src/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.xtend index fc77642dcd0..1dbf7b23e9b 100644 --- a/org.eclipse.xtend.ide.tests/src/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.xtend +++ b/org.eclipse.xtend.ide.tests/src/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.xtend @@ -100,13 +100,22 @@ class JavaEditorExtension { } ], eventMask) producer.apply - while (!changed.get) { + var retries = 30 + while (!changed.get && retries-- > 0) { if (Display.getCurrent() !== null) { while (Display.getDefault().readAndDispatch()) { // process queued ui events } } + if (!changed.get) { + if (VERBOSE) { + println('''sleeping, left retries: «retries»''') + } + Thread.sleep(100) + } } + if (!changed.get) + throw new AssertionError("No event has been received") if (VERBOSE) { println('''end waiting for an element changed event: «eventMask»''') } diff --git a/org.eclipse.xtend.ide.tests/xtend-gen/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.java b/org.eclipse.xtend.ide.tests/xtend-gen/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.java index 88c5f8f128c..0d767bc4d17 100644 --- a/org.eclipse.xtend.ide.tests/xtend-gen/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.java +++ b/org.eclipse.xtend.ide.tests/xtend-gen/org/eclipse/xtend/ide/tests/builder/JavaEditorExtension.java @@ -109,49 +109,72 @@ public String waitForPostChangeEvent(final Procedure0 producer) { } public String waitForElementChangedEvent(final int eventMask, final Procedure0 producer) { - String _xblockexpression = null; - { - if ((JavaEditorExtension.VERBOSE).booleanValue()) { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("start waiting for an element changed event: "); - _builder.append(eventMask); - InputOutput.println(_builder.toString()); - } - final AtomicBoolean changed = new AtomicBoolean(false); - final IElementChangedListener _function = new IElementChangedListener() { - @Override - public void elementChanged(final ElementChangedEvent it) { - JavaCore.removeElementChangedListener(this); - boolean _get = changed.get(); - boolean _not = (!_get); - if (_not) { - changed.set(true); - if ((JavaEditorExtension.VERBOSE).booleanValue()) { - InputOutput.println(it); + try { + String _xblockexpression = null; + { + if ((JavaEditorExtension.VERBOSE).booleanValue()) { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("start waiting for an element changed event: "); + _builder.append(eventMask); + InputOutput.println(_builder.toString()); + } + final AtomicBoolean changed = new AtomicBoolean(false); + final IElementChangedListener _function = new IElementChangedListener() { + @Override + public void elementChanged(final ElementChangedEvent it) { + JavaCore.removeElementChangedListener(this); + boolean _get = changed.get(); + boolean _not = (!_get); + if (_not) { + changed.set(true); + if ((JavaEditorExtension.VERBOSE).booleanValue()) { + InputOutput.println(it); + } } } - } - }; - JavaCore.addElementChangedListener(_function, eventMask); - producer.apply(); - while ((!changed.get())) { - Display _current = Display.getCurrent(); - boolean _tripleNotEquals = (_current != null); - if (_tripleNotEquals) { - while (Display.getDefault().readAndDispatch()) { + }; + JavaCore.addElementChangedListener(_function, eventMask); + producer.apply(); + int retries = 30; + while (((!changed.get()) && (retries-- > 0))) { + { + Display _current = Display.getCurrent(); + boolean _tripleNotEquals = (_current != null); + if (_tripleNotEquals) { + while (Display.getDefault().readAndDispatch()) { + } + } + boolean _get = changed.get(); + boolean _not = (!_get); + if (_not) { + if ((JavaEditorExtension.VERBOSE).booleanValue()) { + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("sleeping, left retries: "); + _builder_1.append(retries); + InputOutput.println(_builder_1.toString()); + } + Thread.sleep(100); + } } } + boolean _get = changed.get(); + boolean _not = (!_get); + if (_not) { + throw new AssertionError("No event has been received"); + } + String _xifexpression = null; + if ((JavaEditorExtension.VERBOSE).booleanValue()) { + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("end waiting for an element changed event: "); + _builder_1.append(eventMask); + _xifexpression = InputOutput.println(_builder_1.toString()); + } + _xblockexpression = _xifexpression; } - String _xifexpression = null; - if ((JavaEditorExtension.VERBOSE).booleanValue()) { - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("end waiting for an element changed event: "); - _builder_1.append(eventMask); - _xifexpression = InputOutput.println(_builder_1.toString()); - } - _xblockexpression = _xifexpression; + return _xblockexpression; + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); } - return _xblockexpression; } public ITextEditor openJavaEditor(final String fileName) {