Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix negation of null values. #16101

Merged
merged 4 commits into from
Jun 26, 2024
Merged

Fix negation of null values. #16101

merged 4 commits into from
Jun 26, 2024

Conversation

grokys
Copy link
Member

@grokys grokys commented Jun 24, 2024

What does the pull request do?

As described in #16071, the recent binding refactor (#13970) broke a use-case of the binding ! operator where it was not correctly converting null; there were a lack of unit tests in this area meaning that this particular case got missed.

The previous design of BindingExpression and its ExpressionNodes assumed that a source of null was an invalid input to all types of expression nodes. It turned out that there was a single exception to this rule: the ! operator can in fact operate on a null value.

This PR tweaks ExpressionNode.OnSourceChanged to now accept a null source. We now have to explicitly check for a null value in every override of OnSourceChanged except in LogicalNotNode. This has unfortunately resulted in a large diff for a relatively trivial change.

Due to this change, we also have to distinguish between null and (unset) in ExpressionNode.SetSource as well.

Unit tests were added to ensure the behavior has not changed since the 11.0 timeframe.

Also took this opportunity to remove ExpressionNode.Reset as it was doing unneeded stuff and should just be the same as SetSource(AvaloniaProperty.UnsetValue, null);.

Fixed issues

Fixes #16071

Expected results come from 11.0.x branch.
Also remove `ExpressionNode.Reset` as it was doing unneeded stuff and should just be the same as `SetSource(AvaloniaProperty.UnsetValue, null);`.
The previous design assumed that a source of `null` was an invalid input to all types of expression nodes. It turned out that there was a single exception to this rule: the `!` operator can in fact operate on a null value. With this new design we instead have to explicitly check for a null value in every override of `OnSourceChanged ` except in `LogicalNotNode`.

Due to this change, we also have to distinguish between `null` and `(unset)` in `ExpressionNode.SetSource` as well.

Fixes #16071
@avaloniaui-bot
Copy link

You can test this PR using the following package version. 11.2.999-cibuild0049207-alpha. (feed url: https://nuget-feed-all.avaloniaui.net/v3/index.json) [PRBUILDID]

@avaloniaui-bot
Copy link

You can test this PR using the following package version. 11.2.999-cibuild0049273-alpha. (feed url: https://nuget-feed-all.avaloniaui.net/v3/index.json) [PRBUILDID]

@maxkatz6 maxkatz6 merged commit 8744c64 into master Jun 26, 2024
11 checks passed
@maxkatz6 maxkatz6 deleted the fixes/16071-null-negation branch June 26, 2024 04:06
grokys added a commit that referenced this pull request Jun 28, 2024
* Add tests for binding negation operator.

Expected results come from 11.0.x branch.

* Unset and null need to be distinct.

Also remove `ExpressionNode.Reset` as it was doing unneeded stuff and should just be the same as `SetSource(AvaloniaProperty.UnsetValue, null);`.

* Make ExpressionNode.OnSourceChanged accept null.

The previous design assumed that a source of `null` was an invalid input to all types of expression nodes. It turned out that there was a single exception to this rule: the `!` operator can in fact operate on a null value. With this new design we instead have to explicitly check for a null value in every override of `OnSourceChanged ` except in `LogicalNotNode`.

Due to this change, we also have to distinguish between `null` and `(unset)` in `ExpressionNode.SetSource` as well.

Fixes #16071

* Fix comment.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Behaviour of !! operator has changed in 11.1
4 participants