Skip to content

Commit

Permalink
Fixed copyWith(value: null) when using nullable generics (#1067)
Browse files Browse the repository at this point in the history
  • Loading branch information
rrousselGit committed Apr 11, 2024
1 parent c773170 commit 18c5cbc
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 49 deletions.
98 changes: 53 additions & 45 deletions packages/_internal/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
url: "https://pub.dev"
source: hosted
version: "61.0.0"
version: "67.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
url: "https://pub.dev"
source: hosted
version: "5.13.0"
version: "6.4.1"
args:
dependency: transitive
description:
Expand Down Expand Up @@ -45,10 +45,10 @@ packages:
dependency: transitive
description:
name: build
sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777"
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
version: "2.4.1"
build_config:
dependency: transitive
description:
Expand All @@ -61,34 +61,34 @@ packages:
dependency: transitive
description:
name: build_daemon
sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169"
sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
version: "4.0.1"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: "0713a05b0386bd97f9e63e78108805a4feca5898a4b821d6610857f10c91e975"
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.4.2"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727
sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
version: "2.4.9"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e"
sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799"
url: "https://pub.dev"
source: hosted
version: "7.2.7+1"
version: "7.3.0"
built_collection:
dependency: transitive
description:
Expand All @@ -101,10 +101,10 @@ packages:
dependency: transitive
description:
name: built_value
sha256: "69acb7007eb2a31dc901512bfe0f7b767168be34cb734835d54c070bfa74c1b2"
sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
url: "https://pub.dev"
source: hosted
version: "8.8.0"
version: "8.9.2"
checked_yaml:
dependency: transitive
description:
Expand All @@ -117,10 +117,10 @@ packages:
dependency: transitive
description:
name: code_builder
sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677"
sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
url: "https://pub.dev"
source: hosted
version: "4.7.0"
version: "4.10.0"
collection:
dependency: transitive
description:
Expand Down Expand Up @@ -149,18 +149,18 @@ packages:
dependency: transitive
description:
name: dart_style
sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55"
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
version: "2.3.6"
file:
dependency: transitive
description:
name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev"
source: hosted
version: "6.1.4"
version: "7.0.0"
fixnum:
dependency: transitive
description:
Expand All @@ -173,10 +173,10 @@ packages:
dependency: "direct dev"
description:
name: freezed
sha256: "57247f692f35f068cae297549a46a9a097100685c6780fe67177503eea5ed4e5"
sha256: "91bce569d4805ea5bad6619a3e8690df8ad062a235165af4c0c5d928dda15eaf"
url: "https://pub.dev"
source: hosted
version: "2.4.7"
version: "2.5.1"
freezed_annotation:
dependency: "direct main"
description:
Expand All @@ -189,10 +189,10 @@ packages:
dependency: transitive
description:
name: frontend_server_client
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "4.0.0"
glob:
dependency: transitive
description:
Expand Down Expand Up @@ -237,10 +237,10 @@ packages:
dependency: transitive
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
url: "https://pub.dev"
source: hosted
version: "0.6.7"
version: "0.7.1"
json_annotation:
dependency: transitive
description:
Expand All @@ -261,26 +261,26 @@ packages:
dependency: transitive
description:
name: matcher
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.dev"
source: hosted
version: "0.12.16"
version: "0.12.16+1"
meta:
dependency: transitive
description:
name: meta
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b"
url: "https://pub.dev"
source: hosted
version: "1.11.0"
version: "1.14.0"
mime:
dependency: transitive
description:
name: mime
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
version: "1.0.5"
package_config:
dependency: transitive
description:
Expand All @@ -293,10 +293,10 @@ packages:
dependency: transitive
description:
name: path
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
version: "1.8.3"
version: "1.9.0"
pool:
dependency: transitive
description:
Expand Down Expand Up @@ -341,10 +341,10 @@ packages:
dependency: transitive
description:
name: source_gen
sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33"
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
url: "https://pub.dev"
source: hosted
version: "1.3.2"
version: "1.5.0"
source_span:
dependency: transitive
description:
Expand Down Expand Up @@ -397,10 +397,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
sha256: "2419f20b0c8677b2d67c8ac4d1ac7372d862dc6c460cdbb052b40155408cd794"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
version: "0.7.1"
timing:
dependency: transitive
description:
Expand All @@ -421,18 +421,26 @@ packages:
dependency: transitive
description:
name: watcher
sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0"
sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
web:
dependency: transitive
description:
name: web
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "0.5.1"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.4.5"
yaml:
dependency: transitive
description:
Expand All @@ -442,4 +450,4 @@ packages:
source: hosted
version: "3.1.2"
sdks:
dart: ">=2.19.0 <4.0.0"
dart: ">=3.3.0 <4.0.0"
4 changes: 4 additions & 0 deletions packages/freezed/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## Unreleased path

- Fixed `copyWith(value: null)` when using nullable generics

## 2.5.1 - 2024-04-08

- Fixed `@freezed` no-longer working inside `part of` files.
Expand Down
11 changes: 7 additions & 4 deletions packages/freezed/lib/src/tools/type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,14 @@ extension DartTypeX on DartType {
}

bool get isNullable {
final that = this;
if (that is TypeParameterType) {
return that.bound.isNullable;
if (isDynamic2 || nullabilitySuffix == NullabilitySuffix.question) {
return true;
}
return isDynamic2 || nullabilitySuffix == NullabilitySuffix.question;

final that = this;
if (that is TypeParameterType) return that.bound.isNullable;

return false;
}
}

Expand Down
20 changes: 20 additions & 0 deletions packages/freezed/test/generic_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,26 @@ void main() {
expect(generic2.model.value, 24);
});

test('supports copyWith(value: null) vs copyWith() on nullable generics', () {
expect(
GenericOrNull<int>(42).copyWith(value: null),
GenericOrNull<int>(null),
);
expect(
GenericOrNull<int>(42).copyWith(),
GenericOrNull<int>(42),
);

expect(
NullableGeneric<int?>(42).copyWith(value: null),
NullableGeneric<int?>(null),
);
expect(
NullableGeneric<int?>(42).copyWith(),
NullableGeneric<int?>(42),
);
});

test('did pass generic constraints', () async {
await expectLater(compile(r'''
import 'generic.dart';
Expand Down
5 changes: 5 additions & 0 deletions packages/freezed/test/integration/generic.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ class NonNullableGeneric<T extends Object> with _$NonNullableGeneric<T> {
factory NonNullableGeneric(T value) = _NonNullableGeneric<T>;
}

@freezed
class GenericOrNull<T extends Object> with _$GenericOrNull<T> {
factory GenericOrNull(T? value) = _GenericOrNull<T>;
}

@freezed
class Generic<T extends Model<dynamic>> with _$Generic<T> {
factory Generic(T model) = _Generic<T>;
Expand Down

0 comments on commit 18c5cbc

Please sign in to comment.