Skip to content

Commit 7818192

Browse files
committed
feat!: migrate to the new element model and remove SerializableLibrary
SerializableLibrary has been removed to simplify the dogs_generator and make it easier to keep it up to date with the upstream analyzer. Porting this to the new directive-based annotation discovery would have been hell since I would have to rewrite portions of lyell for this to properly work. Additionally, the feature was finicky to use and prone to errors anyway. Refs: #19
1 parent 3dcb0b0 commit 7818192

File tree

14 files changed

+136
-362
lines changed

14 files changed

+136
-362
lines changed

benchmarks/pubspec.lock

Lines changed: 82 additions & 74 deletions
Large diffs are not rendered by default.

packages/dogs_core/lib/src/converter.dart

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,30 +76,6 @@ class Serializable {
7676
const Serializable({this.serialName});
7777
}
7878

79-
/// Marks a library import as dogs serializable.
80-
///
81-
/// All types defined inside or exported by the library will be considered
82-
/// serializable. The [include] and [exclude] parameters can be used to
83-
/// further restrict the set of serializable types.
84-
///
85-
/// Types that semantically match a structure conformity or compatibility check must also be
86-
/// correct, invalid items will not be skipped but throw an exception. You must explicitly exclude
87-
/// types that are not serializable using the [exclude] parameter, or only include types that are
88-
/// serializable using the [include] parameter.
89-
///
90-
/// For built_value types, the not serializable builder will automatically be excluded, but will be
91-
/// used for the generation of the actual type converter.
92-
class SerializableLibrary {
93-
/// A list of regex patterns that match the type identifiers to include in the serialization.
94-
final List<String>? include;
95-
96-
/// A list of regex patterns that match the type identifiers to exclude from the serialization.
97-
final List<String>? exclude;
98-
99-
/// see @[SerializableLibrary].
100-
const SerializableLibrary({this.include, this.exclude});
101-
}
102-
10379
/// Marks a class or enum as serializable.
10480
const serializable = Structure(serializable: true);
10581

packages/dogs_generator/build.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ builders:
1313
dogs_bindings:
1414
import: "package:dogs_generator/integrations.dart"
1515
builder_factories: [ "dogsBindings" ]
16-
build_extensions: { ".dart": [ ".conv.dogs", ".slib.dogs" ] }
16+
build_extensions: { ".dart": [ ".conv.dogs" ] }
1717
runs_before: [ "dogs_generator:dogs_reactor" ]
1818
auto_apply: root_package
1919
build_to: cache
2020
dogs_descriptors:
2121
import: "package:dogs_generator/integrations.dart"
2222
builder_factories: [ "dogsConverters" ]
23-
build_extensions: { ".dart": [ ".conv.g.dart", "slib.g.dart" ] }
23+
build_extensions: { ".dart": [ ".conv.g.dart"] }
2424
auto_apply: root_package
2525
build_to: source
2626
dogs_reactor:

packages/dogs_generator/lib/analyze/built_interop.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,23 +95,22 @@ Future<IRStructure> structurizeBuilt(SubjectCodeContext codeContext,
9595
var builderElement =
9696
builtInterfaceImpl.typeArguments[1].element! as ClassElement;
9797

98-
var getters = builderElement.accessors
99-
.where((element) =>
100-
element.isGetter && element.isPublic && !element.isStatic)
98+
var getters = builderElement.getters
99+
.where((element) => element.isPublic && !element.isStatic)
101100
.toList();
102101

103102
var fields = <IRStructureField>[];
104103
for (var builderGetter in getters) {
105-
var fieldGetter = element.getGetter(builderGetter.name)!;
106-
var fieldName = fieldGetter.name;
104+
var fieldGetter = element.getGetter(builderGetter.name!)!;
105+
var fieldName = fieldGetter.name!;
107106
var fieldType = fieldGetter.returnType;
108107
var serialType = await getSerialType(fieldType, context);
109108
var iterableType = await getIterableType(fieldType, context);
110109

111110
var optional = fieldType.nullabilitySuffix == NullabilitySuffix.question;
112111
if (fieldType is DynamicType) optional = true;
113112

114-
var builtValueFieldAnnotation = fieldGetter.metadata
113+
var builtValueFieldAnnotation = fieldGetter.metadata.annotations
115114
.whereTypeChecker(builtValueFieldChecker)
116115
.firstOrNull
117116
?.computeConstantValue();
@@ -140,7 +139,7 @@ Future<IRStructure> structurizeBuilt(SubjectCodeContext codeContext,
140139
return IRStructure(
141140
codeContext.className(element),
142141
StructureConformity.basic,
143-
element.name,
142+
element.name!,
144143
fields,
145144
getRetainedAnnotationSourceArray(element, counter),
146145
);
@@ -203,7 +202,7 @@ Future<void> writeBuiltInteropConverter(ClassElement element,
203202
..static = true
204203
..lambda = false
205204
..body = Code(
206-
"return (${typeRef}Builder()\n${builderElement.accessors.where((element) => element.isGetter && element.isPublic && !element.isStatic).mapIndexed((i, e) {
205+
"return (${typeRef}Builder()\n${builderElement.getters.where((element) => element.isPublic && !element.isStatic).mapIndexed((i, e) {
207206
if (listBuilderChecker.isAssignableFromType(e.returnType)) {
208207
var innerType =
209208
e.returnType.asInstanceOf(listBuilderInterface)!.typeArguments[0];

packages/dogs_generator/lib/analyze/introspect.dart

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ import 'package:dogs_generator/dogs_generator.dart';
2121
import 'package:lyell_gen/lyell_gen.dart';
2222
import 'package:source_gen/source_gen.dart';
2323

24-
final _iterableChecker = TypeChecker.fromRuntime(Iterable);
25-
final _listChecker = TypeChecker.fromRuntime(List);
26-
final _setChecker = TypeChecker.fromRuntime(Set);
27-
final _stringChecker = TypeChecker.fromRuntime(String);
28-
final _intChecker = TypeChecker.fromRuntime(int);
29-
final _doubleChecker = TypeChecker.fromRuntime(double);
30-
final _boolChecker = TypeChecker.fromRuntime(bool);
24+
final _iterableChecker = TypeChecker.typeNamed(Iterable, inSdk: true);
25+
final _listChecker = TypeChecker.typeNamed(List, inSdk: true);
26+
final _setChecker = TypeChecker.typeNamed(Set, inSdk: true);
27+
final _stringChecker = TypeChecker.typeNamed(String, inSdk: true);
28+
final _intChecker = TypeChecker.typeNamed(int, inSdk: true);
29+
final _doubleChecker = TypeChecker.typeNamed(double, inSdk: true);
30+
final _boolChecker = TypeChecker.typeNamed(bool, inSdk: true);
3131

3232
bool isDogPrimitiveType(DartType type) {
33+
if (type is DynamicType || type is VoidType) return true;
3334
return _stringChecker.isExactlyType(type) ||
3435
_intChecker.isExactlyType(type) ||
3536
_doubleChecker.isExactlyType(type) ||
@@ -59,19 +60,19 @@ Future<IterableKind> getIterableType(
5960
}
6061

6162
String getStructureMetadataSourceArray(Element element) {
62-
var conditionChecker = TypeChecker.fromRuntime(StructureMetadata);
63+
var conditionChecker = TypeChecker.typeNamed(StructureMetadata);
6364
var annotations = <String>[];
64-
for (var value in element.metadata.whereTypeChecker(conditionChecker)) {
65+
for (var value in element.metadata.annotations.whereTypeChecker(conditionChecker)) {
6566
annotations.add(value.toSource().substring(1));
6667
}
6768
return "[${annotations.join(", ")}]";
6869
}
6970

7071
String getStructureMetadataSourceArrayAliased(
7172
Element element, List<AliasImport> imports, StructurizeCounter counter) {
72-
var conditionChecker = TypeChecker.fromRuntime(StructureMetadata);
73+
var conditionChecker = TypeChecker.typeNamed(StructureMetadata);
7374
var annotations = <String>[];
74-
for (var value in element.metadata.whereTypeChecker(conditionChecker)) {
75+
for (var value in element.metadata.annotations.whereTypeChecker(conditionChecker)) {
7576
var cszp = "$szPrefix${counter.getAndIncrement()}";
7677
var import = AliasImport.library(
7778
(value.element as ConstructorElement).library, cszp);

packages/dogs_generator/lib/analyze/structurize.dart

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,14 @@ class StructurizeCounter {
9595
}
9696

9797
String szPrefix = "sz";
98-
TypeChecker propertyNameChecker = TypeChecker.fromRuntime(PropertyName);
98+
TypeChecker propertyNameChecker = TypeChecker.typeNamed(PropertyName);
9999
TypeChecker propertySerializerChecker =
100-
TypeChecker.fromRuntime(PropertySerializer);
101-
TypeChecker dataclassChecker = TypeChecker.fromRuntime(Dataclass);
102-
TypeChecker mapChecker = TypeChecker.fromRuntime(Map);
103-
TypeChecker beanIgnoreChecker = TypeChecker.fromRuntime(beanIgnore.runtimeType);
104-
TypeChecker serializableChecker = TypeChecker.fromRuntime(Serializable);
105-
TypeChecker enumPropertyChecker = TypeChecker.fromRuntime(EnumProperty);
100+
TypeChecker.typeNamed(PropertySerializer);
101+
TypeChecker dataclassChecker = TypeChecker.typeNamed(Dataclass);
102+
TypeChecker mapChecker = TypeChecker.typeNamed(Map);
103+
TypeChecker beanIgnoreChecker = TypeChecker.typeNamed(beanIgnore.runtimeType);
104+
TypeChecker serializableChecker = TypeChecker.typeNamed(Serializable);
105+
TypeChecker enumPropertyChecker = TypeChecker.typeNamed(EnumProperty);
106106

107107
Future<StructurizeResult> structurizeConstructor(
108108
DartType type,
@@ -113,7 +113,7 @@ Future<StructurizeResult> structurizeConstructor(
113113
List<AliasImport> imports = [];
114114
List<IRStructureField> fields = [];
115115
var element = type.element! as ClassElement;
116-
var serialName = element.name;
116+
var serialName = element.name!;
117117
serialName = settings.nameCase.recase(serialName);
118118

119119
// Check for Serializable annotation and override serialName if applicable
@@ -132,7 +132,7 @@ Future<StructurizeResult> structurizeConstructor(
132132
constructorName = ".dog";
133133
}
134134

135-
for (var e in constructorElement.parameters) {
135+
for (var e in constructorElement.formalParameters) {
136136
String? fieldName;
137137
DartType? fieldType;
138138
Element? fieldElement;
@@ -142,7 +142,7 @@ Future<StructurizeResult> structurizeConstructor(
142142
fieldType = e.type;
143143
fieldElement = e.field;
144144
} else if (e is SuperFormalParameterElement) {
145-
FieldFormalParameterElement resolveUntilFieldFormal(ParameterElement e) {
145+
FieldFormalParameterElement resolveUntilFieldFormal(FormalParameterElement e) {
146146
if (e is FieldFormalParameterElement) return e;
147147
if (e is SuperFormalParameterElement) {
148148
return resolveUntilFieldFormal(e.superConstructorParameter!);
@@ -156,9 +156,8 @@ Future<StructurizeResult> structurizeConstructor(
156156
fieldElement = field;
157157
} else {
158158
var parameterType = e.type;
159-
var namedField = element.getField(e.name);
160-
var namedGetter = element.augmented
161-
.lookUpGetter(name: e.name, library: element.library);
159+
var namedField = element.getField(e.name!);
160+
var namedGetter = element.lookUpGetter(name: e.name!, library: element.library);
162161
if (namedField != null && namedGetter == null) {
163162
fieldName = e.name;
164163
fieldType = namedField.type;
@@ -220,7 +219,7 @@ Future<StructurizeResult> structurizeConstructor(
220219
// Create proxy arguments
221220
var getters = fields.map((e) => e.accessor).toList();
222221
var activator =
223-
"return ${counter.get(element.thisType)}$constructorName(${constructorElement.parameters.mapIndexed((i, e) {
222+
"return ${counter.get(element.thisType)}$constructorName(${constructorElement.formalParameters.mapIndexed((i, e) {
224223
if (e.isNamed) {
225224
return "${e.name}: list[$i]";
226225
} else {
@@ -246,7 +245,7 @@ Future<StructurizeResult> structurizeBean(
246245
List<AliasImport> imports = [];
247246
List<IRStructureField> fields = [];
248247
var element = type.element! as ClassElement;
249-
var serialName = element.name;
248+
var serialName = element.name!;
250249
serialName = settings.nameCase.recase(serialName);
251250

252251
// Check for Serializable annotation and override serialName if applicable
@@ -259,12 +258,12 @@ Future<StructurizeResult> structurizeBean(
259258
}
260259

261260
var beanFields = classElement.fields.where((element) {
262-
var field = classElement.getField(element.name)!;
261+
var field = classElement.getField(element.name!)!;
263262
if (beanIgnoreChecker.hasAnnotationOf(field)) return false;
264263
return field.getter != null && field.setter != null;
265264
}).toList();
266265
for (var field in beanFields) {
267-
var fieldName = field.name;
266+
var fieldName = field.name!;
268267
var fieldType = field.type;
269268
var serialType = await getSerialType(fieldType, context);
270269
var iterableType = await getIterableType(fieldType, context);

packages/dogs_generator/lib/builders/converter_builder.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class ConverterBuilder extends DogsAdapter<Serializable> {
3131
var emitter = DartEmitter();
3232
var converterName = "${element.name}Converter";
3333

34-
String serialName = element.name;
34+
String serialName = element.name!;
3535
serialName = settings.nameCase.recase(serialName);
3636

3737
var serializableValue = serializableChecker.firstAnnotationOf(element);
@@ -44,7 +44,7 @@ class ConverterBuilder extends DogsAdapter<Serializable> {
4444
final fieldValueMap =
4545
Map.fromEntries(element.fields.where((e) => e.isEnumConstant).map((e) {
4646
final actual = e.name;
47-
var serializedName = e.name;
47+
var serializedName = e.name!;
4848
serializedName = settings.enumCase.recase(serializedName);
4949

5050
final propertyName = propertyNameChecker.firstAnnotationOf(e);
@@ -133,7 +133,7 @@ class ConverterBuilder extends DogsAdapter<Serializable> {
133133
constructor = element.getNamedConstructor("dog");
134134
}
135135
StructurizeResult structurized;
136-
if (constructor != null && constructor.parameters.isNotEmpty) {
136+
if (constructor != null && constructor.formalParameters.isNotEmpty) {
137137
// Create constructor based serializable
138138
structurized = await structurizeConstructor(
139139
element.thisType, settings, constructor, genContext, codeContext.cachedCounter);
@@ -394,7 +394,7 @@ If you wish to use class-level generics, please implement a TreeBaseConverterFac
394394
builder.body = Code(bodyBuilder.toString());
395395
}));
396396

397-
var hasRebuildHook = TypeChecker.fromRuntime(PostRebuildHook)
397+
var hasRebuildHook = TypeChecker.typeNamed(PostRebuildHook)
398398
.isAssignableFromType(element.thisType);
399399

400400
builder.methods.add(Method((builder) => builder

0 commit comments

Comments
 (0)