Skip to content

Commit aee8507

Browse files
authored
Support ConstructorElement (#1183)
1 parent 9b8050c commit aee8507

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

json_serializable/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## 6.4.2-dev
22

3+
- Support `ConstructorElement` which allows using tear-off constructors.
4+
35
## 6.4.1
46

57
- Fixed a bug when an `@JsonSerializable` class uses a mixin with fields.

json_serializable/lib/src/utils.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,14 @@ extension ExecutableElementExtension on ExecutableElement {
232232
return '${enclosingElement3.name}.$name';
233233
}
234234

235+
if (this is ConstructorElement) {
236+
// Ignore the default constructor.
237+
if (name.isEmpty) {
238+
return '${enclosingElement3.name}';
239+
}
240+
return '${enclosingElement3.name}.$name';
241+
}
242+
235243
throw UnsupportedError(
236244
'Not sure how to support typeof $runtimeType',
237245
);

json_serializable/test/json_serializable_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ const _expectedAnnotatedTests = {
126126
'SubTypeWithAnnotatedFieldOverrideExtendsWithOverrides',
127127
'SubTypeWithAnnotatedFieldOverrideImplements',
128128
'theAnswer',
129+
'TearOffFromJsonClass',
129130
'ToJsonNullableFalseIncludeIfNullFalse',
130131
'TypedConvertMethods',
131132
'UnknownEnumValue',

json_serializable/test/src/_json_serializable_test_input.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,3 +579,31 @@ class Issue1038RegressionTest {
579579

580580
Issue1038RegressionTest.ean(this.ean) : id = null;
581581
}
582+
583+
@ShouldGenerate(
584+
r'''
585+
TearOffFromJsonClass _$TearOffFromJsonClassFromJson(
586+
Map<String, dynamic> json) =>
587+
TearOffFromJsonClass(
588+
TearOffValueClass(json['value'] as String),
589+
TearOffValueClass.fromJson(json['factoryValue'] as String),
590+
);
591+
''',
592+
)
593+
@JsonSerializable(createToJson: false)
594+
class TearOffFromJsonClass {
595+
TearOffFromJsonClass(this.value, this.factoryValue);
596+
597+
@JsonKey(fromJson: TearOffValueClass.new)
598+
final TearOffValueClass value;
599+
@JsonKey(fromJson: TearOffValueClass.fromJson)
600+
final TearOffValueClass factoryValue;
601+
}
602+
603+
class TearOffValueClass {
604+
const TearOffValueClass(this.value);
605+
606+
factory TearOffValueClass.fromJson(String value) => TearOffValueClass(value);
607+
608+
final String value;
609+
}

0 commit comments

Comments
 (0)