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

Add remaining dart fixes for Color deprecations when importing painting.dart #162609

Merged
merged 5 commits into from
Mar 14, 2025

Conversation

Piinks
Copy link
Contributor

@Piinks Piinks commented Feb 3, 2025

Towards #160617

Noticed the opacity and withOpacity deprecations were supported by dart fix, but not the others. Adding them here.

But strange too given dart:ui does not support dart fix (dart-lang/sdk#59764)..


We think since painting.dart exports dart:ui, this is somewhat of a workaround.

If a user has this atop their file:

import 'package:flutter/painting.dart'; // 👍  dart fix will work here

If instead

import 'dart:ui'; // ❌  dart fix will not work here

Will continue to follow up on dart fix support for dart:X libraries, for now hopefully this will help!

Pre-launch Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@Piinks Piinks requested a review from gaaclarke February 3, 2025 16:58
@github-actions github-actions bot added framework flutter/packages/flutter repository. See also f: labels. c: tech-debt Technical debt, code quality, testing, etc. labels Feb 3, 2025
@Piinks
Copy link
Contributor Author

Piinks commented Feb 3, 2025

FYI @bwilkerson for this somewhat workaround we found. :)

- kind: 'rename'
newName: 'a'

- title: "Rename from 'red' to 'r'"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

beware of #161598, I introduced subtle bugs in a downstream library due to this

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, i don't think these should be rename fixes. Instead it should do something like this to avoid the introduction of bugs.

foo.red;
(foo.r * 255.0).round() & 0xff;

- kind: 'rename'
newName: 'a'

- title: "Rename from 'red' to 'r'"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, i don't think these should be rename fixes. Instead it should do something like this to avoid the introduction of bugs.

foo.red;
(foo.r * 255.0).round() & 0xff;

@Piinks
Copy link
Contributor Author

Piinks commented Feb 3, 2025

So I think this is as close as I can get it.. There will be a missing parenthesis, but the analyzer will help with that.

myColor.blue; // before
myColor.b * 255.0).round() & 0xff; // after

We have several 'partial' fixes like this, since it gets folks most of the way there.

Might double check with @bwilkerson though. I don't think any other data driven fix rules will get me that extra opening parenthesis.

@Piinks Piinks requested a review from gaaclarke February 3, 2025 23:29
Copy link
Member

@gaaclarke gaaclarke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unfortunate, I'm interested in what @bwilkerson has to say. Maybe there is a better alternative.

@Piinks can you link to prior art here so I can see what we are doing elsewhere. As this PR is written it generates broken syntax. This is going to freak out formatters and leave people counting parenthesis.

I wonder if we should have proper dart syntax, but broken semantics. Something like:

color.blue;
// becomes
color._((color.b * 255.0).round() & 0xff);

Both options are bad but at least this is valid syntax. People just have to delete the method call (color._). I honestly think no dart fix is better than a broken dart fix.

If we can't get it to fix the code correctly, maybe we can just get a custom message in the linter failure that tells people exactly what they need to write?

@bwilkerson
Copy link
Contributor

Sorry for the long delay. I'm just catching up after a 3 day team training session.

@gaaclarke is right that this is not how rename is intended to be used. The newName should just be the new name of the member (a valid identifier). We should consider adding a diagnostic for that (though it would be a breaking change, so it might not be practical to do).

Also, for the change from value to toARGB32, this should be a replace because the kind of the member changed from a getter to a method. That would allow you to drop the () from the name.

But the real problem here is that data-driven fixes don't yet support the ability to change the return type. We should add that capability, but I don't know what your timeframe for this is so I don't know whether we can get it done in time. I added an issue to track the work and discuss the requirements: dart-lang/sdk#60079.

Also, I'm interested to know what other cases people have run into where fix_data.yaml had to be worked around in order to get the kind of output you really wanted. If nothing else we should put enhancements to fix those shortcomings on our backlog.

@keertip

@github-actions github-actions bot added the engine flutter/engine repository. See also e: labels. label Mar 13, 2025
@Piinks
Copy link
Contributor Author

Piinks commented Mar 13, 2025

Reviving this PR that I clearly let fall through a crack...

From @gaaclarke

can you link to prior art here so I can see what we are doing elsewhere. [partial fixes]

I know we have done this several times, but we have several hundred fixes now. I have not been able to dig through them to find an example for you.

color._((color.b * 255.0).round() & 0xff);

This would be nice, but dart fix can't do this. I can't grab the color variable there to use in the new snippet of code, it is not accessible.

If we can't get it to fix the code correctly, maybe we can just get a custom message in the linter failure that tells people exactly what they need to write?

I still think the partial fix is more helpful to the user trying to navigate this change. That being said, I've removed the partial fixes, and instead updated the deprecation lint to provide the correct code. I think this was the main friction point developers were sharing with us anyways, red != r, so folks trying to migrate based on the lint message were still broken and confused.

From @bwilkerson

for the change from value to toARGB32, this should be a replace

Done.

Thanks for the feedback all. PTAL

Copy link
Member

@gaaclarke gaaclarke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The lint message changes look great, the value rename fix looks good. I'm not sure we want the alpha rename though. It has similar problems as the red, green, blue renames.

Comment on lines 130 to 138
- title: "Rename from 'alpha' to 'a'"
date: 2024-09-10
element:
uris: [ 'painting.dart' ]
method: 'alpha'
inClass: 'Color'
changes:
- kind: 'rename'
newName: 'a'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know if we want this change since it can lead to subtle bugs.

double foo = color.alpha / 255.0 becoming double foo = color.a / 255.0 will give very different results.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to r, g, b, I think the subtleties like this are what folks are really hurting over with this migration.

Should the alpha deprecation instead also have a better lint message?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, let's do that.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With a != alpha, what is the conversion then? The migration guide doesn't mention it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The math is the same as the one for the [red, green, blue] color components. We mention it in this section of the migration guide: https://docs.flutter.dev/release/breaking-changes/wide-gamut-framework#access-color-components

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah thank you!

@Piinks Piinks requested a review from gaaclarke March 14, 2025 17:24
@@ -270,19 +270,19 @@ class Color {
///
/// A value of 0.0 means this color is fully transparent. A value of 1.0 means
/// this color is fully opaque.
@Deprecated('Use .a.')
@Deprecated('Use (*.a * 255.0).round() & 0xff')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You accidentally added this to opacity not alpha =)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whoops, must be Friday. 😅

Copy link
Member

@gaaclarke gaaclarke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @Piinks !

@Piinks Piinks added the autosubmit Merge PR when tree becomes green via auto submit App label Mar 14, 2025
@auto-submit auto-submit bot added this pull request to the merge queue Mar 14, 2025
Merged via the queue into flutter:master with commit b2bbb52 Mar 14, 2025
169 checks passed
@flutter-dashboard flutter-dashboard bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Mar 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 15, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 15, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 16, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 16, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 16, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 17, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
c: tech-debt Technical debt, code quality, testing, etc. engine flutter/engine repository. See also e: labels. framework flutter/packages/flutter repository. See also f: labels.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants