Leave a failed conversion in the control and keep the previous Attribute.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-30 18:45:12 +01:00
co-authored by Cursor
parent eaebe66b0d
commit 398883d20a
3 changed files with 4 additions and 14 deletions
@@ -252,7 +252,6 @@ final class DirectBindingApplier {
link.applying = true; link.applying = true;
try { try {
control.setValue(shown); control.setValue(shown);
link.committedControl = shown;
} finally { } finally {
link.applying = false; link.applying = false;
} }
@@ -269,18 +268,11 @@ final class DirectBindingApplier {
link.applying = true; link.applying = true;
try { try {
attribute.setValue(converted); attribute.setValue(converted);
link.committedControl = control.getValue();
} finally { } finally {
link.applying = false; link.applying = false;
} }
owner.clearBindingFailure(source); owner.clearBindingFailure(source);
} catch (RuntimeException failure) { } catch (RuntimeException failure) {
link.applying = true;
try {
control.setValue(link.committedControl);
} finally {
link.applying = false;
}
owner.reportBindingFailure(source, failureText(failure)); owner.reportBindingFailure(source, failureText(failure));
} }
} }
@@ -294,12 +286,10 @@ final class DirectBindingApplier {
} }
/** /**
* Guards one converted binding against hearing its own writes, and remembers the last * Guards one converted binding against hearing its own writes.
* control value that was successfully shown.
*/ */
private static final class Link { private static final class Link {
private boolean applying; private boolean applying;
private Object committedControl;
} }
private static Property<?> controlProperty(Object control, String propertyName) { private static Property<?> controlProperty(Object control, String propertyName) {
@@ -103,7 +103,7 @@ class CarryChildMessageTest {
streetField.setText("nope"); streetField.setText("nope");
assertEquals("Main", person.getAddress().getStreet()); assertEquals("Main", person.getAddress().getStreet());
assertEquals("Main", streetField.getText()); assertEquals("nope", streetField.getText());
ViewModel personModel = loaded.getViewModel(); ViewModel personModel = loaded.getViewModel();
ViewModel addressModel = (ViewModel) personModel.property("address").getValue(); ViewModel addressModel = (ViewModel) personModel.property("address").getValue();
assertEquals(1, addressModel.getMessages().size()); assertEquals(1, addressModel.getMessages().size());
@@ -135,7 +135,7 @@ class ConvertAndRecordFailureTest {
TextField ageField = (TextField) loaded.getRoot().lookup("#ageField"); TextField ageField = (TextField) loaded.getRoot().lookup("#ageField");
ageField.setText("nope"); ageField.setText("nope");
assertEquals(Integer.valueOf(42), person.getAge()); assertEquals(Integer.valueOf(42), person.getAge());
assertEquals("years:42", ageField.getText()); assertEquals("nope", ageField.getText());
ViewModel viewModel = loaded.getViewModel(); ViewModel viewModel = loaded.getViewModel();
assertEquals(1, viewModel.getMessages().size()); assertEquals(1, viewModel.getMessages().size());
Message message = viewModel.getMessages().get(0); Message message = viewModel.getMessages().get(0);
@@ -164,7 +164,7 @@ class ConvertAndRecordFailureTest {
assertSame(first, viewModel.getMessages().get(0)); assertSame(first, viewModel.getMessages().get(0));
assertEquals("not a whole number: still-bad", first.getText()); assertEquals("not a whole number: still-bad", first.getText());
assertEquals(Integer.valueOf(42), person.getAge()); assertEquals(Integer.valueOf(42), person.getAge());
assertEquals("years:42", ageField.getText()); assertEquals("still-bad", ageField.getText());
}); });
} }