@@ -99,6 +99,7 @@ TypeChecker mapChecker = TypeChecker.typeNamed(Map);
9999TypeChecker beanIgnoreChecker = TypeChecker .typeNamed (beanIgnore.runtimeType);
100100TypeChecker serializableChecker = TypeChecker .typeNamed (Serializable );
101101TypeChecker enumPropertyChecker = TypeChecker .typeNamed (EnumProperty );
102+ TypeChecker polymorphicChecker = TypeChecker .typeNamedLiterally ("_Polymorphic" );
102103
103104Future <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+
233266Future <StructurizeResult > structurizeBean (
234267 DartType type,
235268 DogsGeneratorSettings settings,
0 commit comments