Skip to content

Commit cd77f7a

Browse files
authored
Don't assume we need a constructor too early in build process (#1049)
Fixes #1038
1 parent 85ac59f commit cd77f7a

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

json_serializable/lib/src/utils.dart

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ ClassConfig mergeConfig(
8484
assert(config.ctorParamDefaults.isEmpty);
8585

8686
final constructor = annotation.constructor ?? config.constructor;
87-
final constructorInstance = constructorByName(classElement, constructor);
87+
final constructorInstance =
88+
constructorByNameOrNull(classElement, constructor);
8889

89-
final paramDefaultValueMap = Map<String, String>.fromEntries(
90-
constructorInstance.parameters
90+
final paramDefaultValueMap = constructorInstance == null
91+
? <String, String>{}
92+
: Map<String, String>.fromEntries(constructorInstance.parameters
9193
.where((element) => element.hasDefaultValue)
9294
.map((e) => MapEntry(e.name, e.defaultValueCode!)));
9395

@@ -110,6 +112,18 @@ ClassConfig mergeConfig(
110112
);
111113
}
112114

115+
ConstructorElement? constructorByNameOrNull(
116+
ClassElement classElement,
117+
String name,
118+
) {
119+
try {
120+
return constructorByName(classElement, name);
121+
// ignore: avoid_catching_errors
122+
} on InvalidGenerationSourceError {
123+
return null;
124+
}
125+
}
126+
113127
ConstructorElement constructorByName(ClassElement classElement, String name) {
114128
final className = classElement.name;
115129

json_serializable/test/json_serializable_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ const _expectedAnnotatedTests = {
7979
'InvalidFromFunc2Args',
8080
'InvalidToFunc2Args',
8181
'Issue713',
82+
'Issue1038RegressionTest',
8283
'JsonConvertOnField',
8384
'JsonConverterCtorParams',
8485
'JsonConverterDuplicateAnnotations',

json_serializable/test/src/_json_serializable_test_input.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,3 +561,21 @@ class ExtraParamToJson {
561561

562562
Map<String, dynamic> toJson(int bob) => throw UnimplementedError();
563563
}
564+
565+
@ShouldGenerate(r'''
566+
Map<String, dynamic> _$Issue1038RegressionTestToJson(
567+
Issue1038RegressionTest instance) =>
568+
<String, dynamic>{
569+
'id': instance.id,
570+
'ean': instance.ean,
571+
};
572+
''')
573+
@JsonSerializable(createFactory: false)
574+
class Issue1038RegressionTest {
575+
final String? id;
576+
final String? ean;
577+
578+
Issue1038RegressionTest.id(this.id) : ean = null;
579+
580+
Issue1038RegressionTest.ean(this.ean) : id = null;
581+
}

0 commit comments

Comments
 (0)