Skip to content

Commit 160f6b0

Browse files
committed
feat: add support for inheritable polymorphic annotations
Refs: #28
1 parent da14f4a commit 160f6b0

2 files changed

Lines changed: 36 additions & 3 deletions

File tree

packages/dogs_generator/lib/analyze/structurize.dart

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ TypeChecker mapChecker = TypeChecker.typeNamed(Map);
9999
TypeChecker beanIgnoreChecker = TypeChecker.typeNamed(beanIgnore.runtimeType);
100100
TypeChecker serializableChecker = TypeChecker.typeNamed(Serializable);
101101
TypeChecker enumPropertyChecker = TypeChecker.typeNamed(EnumProperty);
102+
TypeChecker polymorphicChecker = TypeChecker.typeNamedLiterally("_Polymorphic");
102103

103104
Future<StructurizeResult> structurizeConstructor(
104105
DartType type,
@@ -196,17 +197,26 @@ Future<StructurizeResult> structurizeConstructor(
196197
propertySerializer = counter.get(serializerAnnotation.getField("type")!.toTypeValue()!);
197198
}
198199

200+
var typeTree = getTypeTree(fieldType);
201+
var sourceArray = getRetainedAnnotationSourceArray(fieldElement, counter);
202+
203+
var isPolymorphic = _inheritsPolymorphic(typeTree);
204+
if (isPolymorphic) {
205+
sourceArray = _addToSourceArray(sourceArray, "gen.polymorphic");
206+
}
207+
208+
199209
fields.add(IRStructureField(
200210
fieldName,
201211
counter.get(fieldType),
202-
getTypeTree(fieldType).code(counter),
212+
typeTree.code(counter),
203213
propertySerializer,
204214
counter.get(serialType),
205215
iterableType,
206216
propertyName,
207217
optional,
208218
!isDogPrimitiveType(serialType),
209-
getRetainedAnnotationSourceArray(fieldElement, counter),
219+
sourceArray,
210220
mapChecker.isAssignableFrom(fieldType.element!)));
211221
}
212222

@@ -230,6 +240,29 @@ Future<StructurizeResult> structurizeConstructor(
230240
return StructurizeResult(imports, structure, getters, activator);
231241
}
232242

243+
bool _inheritsPolymorphic(GeneratedTypeTree tree) {
244+
var typeElement = tree.base.element;
245+
if (typeElement != null) {
246+
if (polymorphicChecker.hasAnnotationOf(typeElement)) {
247+
return true;
248+
}
249+
}
250+
for (var element in tree.parameters) {
251+
if (_inheritsPolymorphic(element)) {
252+
return true;
253+
}
254+
}
255+
return false;
256+
}
257+
258+
String _addToSourceArray(String sourceArray, String newSource) {
259+
if (sourceArray == "[]") {
260+
return "[$newSource]";
261+
} else {
262+
return "${sourceArray.substring(0, sourceArray.length - 1)}, $newSource]";
263+
}
264+
}
265+
233266
Future<StructurizeResult> structurizeBean(
234267
DartType type,
235268
DogsGeneratorSettings settings,

smoke/test0/lib/models.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'package:dogs_core/dogs_core.dart';
2020
import 'package:dogs_core/dogs_validation.dart';
2121
import 'package:smoke_test_0/special.dart';
2222

23+
@polymorphic
2324
abstract class ABInterface {}
2425

2526
@serializable
@@ -112,7 +113,6 @@ class ModelE with Dataclass<ModelE> {
112113
@polymorphic
113114
final List<Object> objectPolymorphicList;
114115

115-
@polymorphic
116116
final List<ABInterface> restrictedPolymorphicList;
117117

118118
ModelE(this.polymorphicList, this.objectPolymorphicList,

0 commit comments

Comments
 (0)