@@ -9,41 +9,68 @@ import 'package:nitrite_generator/src/type_validator.dart';
9
9
import 'package:source_gen/source_gen.dart' ;
10
10
11
11
class ConverterParser extends Parser <ConverterInfo > {
12
- final ClassElement _classElement ;
12
+ final InterfaceElement _element ;
13
13
14
- ConverterParser (this ._classElement );
14
+ ConverterParser (this ._element );
15
15
16
16
@override
17
17
ConverterInfo parse () {
18
- var className = _getClassName ();
18
+ if (_element is ClassElement ) {
19
+ var className = _getClassName ();
19
20
20
- // generated class name
21
- var converterName = _getConverterName ();
21
+ // generated class name
22
+ var converterName = _getConverterName ();
22
23
23
- // constructor information
24
- var ctorInfo = _getConstructorInfo ();
24
+ // constructor information
25
+ var ctorInfo = _getConstructorInfo ();
25
26
26
- // field information
27
- var fieldInfoList = _getFieldInfoList ();
27
+ // field information
28
+ var fieldInfoList = _getFieldInfoList ();
28
29
29
- // property information
30
- var propertyInfoList = _getPropertyInfoList ();
30
+ // property information
31
+ var propertyInfoList = _getPropertyInfoList ();
31
32
32
- // validate the class and filter out duplicate information
33
- _validateConverter (ctorInfo, propertyInfoList, fieldInfoList);
33
+ // validate the class and filter out duplicate information
34
+ _validateConverter (ctorInfo, propertyInfoList, fieldInfoList);
34
35
35
- return ConverterInfo (
36
- className, converterName, fieldInfoList, propertyInfoList, ctorInfo);
36
+ return ConverterInfo (
37
+ className,
38
+ converterName,
39
+ false ,
40
+ fieldInfoList,
41
+ propertyInfoList,
42
+ ctorInfo,
43
+ );
44
+ } else if (_element is EnumElement ) {
45
+ // enum class name
46
+ var className = _getClassName ();
47
+
48
+ // generated class name
49
+ var converterName = _getConverterName ();
50
+
51
+ return ConverterInfo (
52
+ className,
53
+ converterName,
54
+ true ,
55
+ [],
56
+ [],
57
+ );
58
+ } else {
59
+ throw InvalidGenerationSourceError (
60
+ '`@Convertable` can only be used on classes or enums.' ,
61
+ element: _element,
62
+ );
63
+ }
37
64
}
38
65
39
66
String _getConverterName () {
40
- var converterName = _classElement
67
+ var converterName = _element
41
68
.getAnnotation (Convertable )
42
69
? .getField (ConverterField .className)
43
70
? .toStringValue ();
44
71
45
72
if (converterName == null || converterName.isEmpty) {
46
- return '${_classElement .displayName }Converter' ;
73
+ return '${_element .displayName }Converter' ;
47
74
} else {
48
75
return converterName;
49
76
}
@@ -87,43 +114,52 @@ class ConverterParser extends Parser<ConverterInfo> {
87
114
}
88
115
89
116
String _getClassName () {
90
- // check mixin
91
- if (_classElement.mixins.isNotEmpty) {
92
- /*
117
+ if (_element is ClassElement ) {
118
+ // check mixin
119
+ if (_element.isMixinClass) {
120
+ /*
93
121
* mixin A {
94
122
* String? a;
95
123
* }
96
124
*
97
125
* 1. mixins can not be instantiated
98
126
* */
99
127
100
- throw InvalidGenerationSourceError (
101
- '`@Convertable` can not be used with mixins.' ,
102
- element: _classElement ,
103
- );
104
- }
128
+ throw InvalidGenerationSourceError (
129
+ '`@Convertable` can not be used with mixins.' ,
130
+ element: _element ,
131
+ );
132
+ }
105
133
106
- if (_classElement .isAbstract) {
107
- /*
134
+ if (_element .isAbstract) {
135
+ /*
108
136
* abstract class A {
109
137
* String? a;
110
138
* }
111
139
*
112
140
* 1. abstract class can not be instantiated
113
141
* */
114
142
143
+ throw InvalidGenerationSourceError (
144
+ '`@Convertable` can not be used on abstract class.' ,
145
+ element: _element,
146
+ );
147
+ }
148
+
149
+ return _element.displayName;
150
+ } else if (_element is EnumElement ) {
151
+ return _element.displayName;
152
+ } else {
115
153
throw InvalidGenerationSourceError (
116
- '`@Convertable` can not be used on abstract class .' ,
117
- element: _classElement ,
154
+ '`@Convertable` can only be used on classes or enums .' ,
155
+ element: _element ,
118
156
);
119
157
}
120
-
121
- return _classElement.displayName;
122
158
}
123
159
124
160
ConstructorInfo _getConstructorInfo () {
125
161
// check for valid constructors
126
- var constructors = _classElement .constructors;
162
+ var constructors = _element .constructors;
127
163
var validConstructors = constructors.where ((ctor) =>
128
164
ctor.isPublic &&
129
165
ctor.name.isEmpty &&
@@ -162,7 +198,7 @@ class ConverterParser extends Parser<ConverterInfo> {
162
198
'`@Convertable` can only be used on class which has at least '
163
199
'one public constructor which is either a default constructor or one '
164
200
'with all optional/named parameters.' ,
165
- element: _classElement ,
201
+ element: _element ,
166
202
);
167
203
}
168
204
@@ -201,7 +237,7 @@ class ConverterParser extends Parser<ConverterInfo> {
201
237
202
238
List <FieldInfo > _getFieldInfoList () {
203
239
var fieldInfos = < FieldInfo > {};
204
- var fieldElements = _classElement .fields;
240
+ var fieldElements = _element .fields;
205
241
for (var element in fieldElements) {
206
242
if (_isValidField (element)) {
207
243
// find out if alias is provided
@@ -220,7 +256,7 @@ class ConverterParser extends Parser<ConverterInfo> {
220
256
}
221
257
222
258
// get field details from parents
223
- var supertypes = _classElement .allSupertypes;
259
+ var supertypes = _element .allSupertypes;
224
260
for (var type in supertypes) {
225
261
// use recursion to scan the hierarchy
226
262
var superParser = ConverterParser (type.element as ClassElement );
@@ -235,7 +271,7 @@ class ConverterParser extends Parser<ConverterInfo> {
235
271
236
272
List <PropertyInfo > _getPropertyInfoList () {
237
273
var propInfos = < PropertyInfo > {};
238
- var accessors = _classElement .accessors;
274
+ var accessors = _element .accessors;
239
275
240
276
for (var accessor in accessors) {
241
277
// validate valid type
@@ -261,7 +297,7 @@ class ConverterParser extends Parser<ConverterInfo> {
261
297
throw InvalidGenerationSourceError (
262
298
'A getter accessor must be defined for corresponding setter '
263
299
'${accessor .displayName }' ,
264
- element: _classElement );
300
+ element: _element );
265
301
}
266
302
267
303
if (accessor.isGetter) {
@@ -326,7 +362,7 @@ class ConverterParser extends Parser<ConverterInfo> {
326
362
}
327
363
328
364
// get property info from parents
329
- var supertypes = _classElement .allSupertypes;
365
+ var supertypes = _element .allSupertypes;
330
366
for (var type in supertypes) {
331
367
// use recursion to scan the hierarchy
332
368
var superParser = ConverterParser (type.element as ClassElement );
@@ -363,7 +399,7 @@ class ConverterParser extends Parser<ConverterInfo> {
363
399
throw InvalidGenerationSourceError (
364
400
'A class with a constructor having all positional optional '
365
401
'parameters should not have a final field.' ,
366
- element: _classElement );
402
+ element: _element );
367
403
}
368
404
}
369
405
@@ -385,7 +421,7 @@ class ConverterParser extends Parser<ConverterInfo> {
385
421
'A class with a constructor having all named parameters '
386
422
'should have all the fields\' names matching with the name of the '
387
423
'constructor parameters.' ,
388
- element: _classElement );
424
+ element: _element );
389
425
}
390
426
}
391
427
@@ -397,10 +433,10 @@ class ConverterParser extends Parser<ConverterInfo> {
397
433
398
434
throw InvalidGenerationSourceError (
399
435
'No suitable constructor found for the class '
400
- '${_classElement .displayName }. A class should have at least one public '
436
+ '${_element .displayName }. A class should have at least one public '
401
437
'constructor which is either a default constructor or one with all '
402
438
'optional/named parameters.' ,
403
- element: _classElement );
439
+ element: _element );
404
440
}
405
441
406
442
for (var fieldInfo in fieldInfoList) {
@@ -430,7 +466,7 @@ class ConverterParser extends Parser<ConverterInfo> {
430
466
throw InvalidGenerationSourceError (
431
467
'A required named constructor parameter ${ctorParam .paramName } '
432
468
'with non-nullable type cannot be ignored' ,
433
- element: _classElement );
469
+ element: _element );
434
470
} else {
435
471
// if nullable set null during constructor call
436
472
fieldInfo.setNull = true ;
@@ -466,7 +502,7 @@ class ConverterParser extends Parser<ConverterInfo> {
466
502
467
503
throw InvalidGenerationSourceError (
468
504
'Getter accessor is not defined for ${propInfo .setterFieldName }' ,
469
- element: _classElement );
505
+ element: _element );
470
506
}
471
507
472
508
if (propInfo.setterFieldName.isEmpty) {
@@ -480,7 +516,7 @@ class ConverterParser extends Parser<ConverterInfo> {
480
516
481
517
throw InvalidGenerationSourceError (
482
518
'Setter accessor is not defined for ${propInfo .getterFieldName }' ,
483
- element: _classElement );
519
+ element: _element );
484
520
}
485
521
}
486
522
}
0 commit comments