Skip to content

Commit 1cdf969

Browse files
authored
refactor: Separate ClassDefinition into specialization classes. (serverpod#3270)
1 parent 6565f37 commit 1cdf969

File tree

86 files changed

+994
-604
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+994
-604
lines changed

tools/serverpod_cli/lib/analyzer.dart

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export 'src/analyzer/models/definitions.dart'
1010
show
1111
SerializableModelDefinition,
1212
ClassDefinition,
13+
ModelClassDefinition,
14+
ExceptionClassDefinition,
1315
SerializableModelFieldDefinition,
1416
ModelFieldScopeDefinition,
1517
SerializableModelIndexDefinition,

tools/serverpod_cli/lib/src/analyzer/models/checker/analyze_checker.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ class AnalyzeChecker {
1919
}
2020

2121
static List<SerializableModelFieldDefinition> filterRelationByName(
22-
ClassDefinition classDefinition,
23-
ClassDefinition foreignClass,
22+
ModelClassDefinition classDefinition,
23+
ModelClassDefinition foreignClass,
2424
String relationFieldName,
2525
String? relationName,
2626
) {

tools/serverpod_cli/lib/src/analyzer/models/definitions.dart

+52-26
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,44 @@ sealed class SerializableModelDefinition {
3434
///
3535
/// See also:
3636
/// - [EnumDefinition]
37-
class ClassDefinition extends SerializableModelDefinition {
37+
sealed class ClassDefinition extends SerializableModelDefinition {
38+
/// The fields of this class / exception.
39+
List<SerializableModelFieldDefinition> fields;
40+
41+
/// The documentation of this class, line by line.
42+
final List<String>? documentation;
43+
44+
/// Create a new [ClassDefinition].
45+
ClassDefinition({
46+
required super.fileName,
47+
required super.sourceFileName,
48+
required super.className,
49+
required this.fields,
50+
required super.serverOnly,
51+
required super.type,
52+
super.subDirParts,
53+
this.documentation,
54+
});
55+
56+
SerializableModelFieldDefinition? findField(String name) {
57+
return fields.where((element) => element.name == name).firstOrNull;
58+
}
59+
}
60+
61+
/// A [ClassDefinition] specialization that represents a model class.
62+
final class ModelClassDefinition extends ClassDefinition {
3863
/// If set, the name of the table, this class should be stored in, in the
3964
/// database.
4065
final String? tableName;
4166

42-
/// The fields of this class / exception.
43-
List<SerializableModelFieldDefinition> fields;
44-
4567
/// The indexes that should be created for the table [tableName] representing
4668
/// this class.
4769
///
4870
/// The index over the primary key `id` is not part of this list.
4971
final List<SerializableModelIndexDefinition> indexes;
5072

51-
/// The documentation of this class, line by line.
52-
final List<String>? documentation;
53-
5473
final bool manageMigration;
5574

56-
/// `true` if this is an exception and not a class.
57-
final bool isException;
58-
5975
/// If set to true the class is sealed.
6076
final bool isSealed;
6177

@@ -65,34 +81,29 @@ class ClassDefinition extends SerializableModelDefinition {
6581
/// If set to [InheritanceDefinitions] the class extends another class and stores the [ClassDefinition] of it's parent.
6682
InheritanceDefinition? extendsClass;
6783

68-
List<ClassDefinition>? _descendantClasses;
84+
List<ModelClassDefinition>? _descendantClasses;
6985

70-
/// Create a new [ClassDefinition].
71-
ClassDefinition({
86+
/// Create a new [ModelClassDefinition].
87+
ModelClassDefinition({
7288
required super.fileName,
7389
required super.sourceFileName,
7490
required super.className,
75-
required this.fields,
91+
required super.fields,
7692
required super.serverOnly,
7793
required this.manageMigration,
78-
required this.isException,
7994
required super.type,
8095
required this.isSealed,
8196
List<InheritanceDefinition>? childClasses,
8297
this.extendsClass,
8398
this.tableName,
8499
this.indexes = const [],
85100
super.subDirParts,
86-
this.documentation,
101+
super.documentation,
87102
}) : childClasses = childClasses ?? <InheritanceDefinition>[];
88103

89-
SerializableModelFieldDefinition? findField(String name) {
90-
return fields.where((element) => element.name == name).firstOrNull;
91-
}
92-
93-
/// Returns the `ClassDefinition` of the parent class.
104+
/// Returns the `ModelClassDefinition` of the parent class.
94105
/// If there is no parent class, `null` is returned.
95-
ClassDefinition? get parentClass {
106+
ModelClassDefinition? get parentClass {
96107
var extendsClass = this.extendsClass;
97108
if (extendsClass is! ResolvedInheritanceDefinition) return null;
98109

@@ -152,12 +163,12 @@ class ClassDefinition extends SerializableModelDefinition {
152163
/// Returns a list of all descendant classes.
153164
/// This includes all child classes and their descendants.
154165
/// If the class has no child classes, an empty list is returned.
155-
List<ClassDefinition> get descendantClasses {
166+
List<ModelClassDefinition> get descendantClasses {
156167
return _descendantClasses ??= _computeDescendantClasses();
157168
}
158169

159-
List<ClassDefinition> _computeDescendantClasses() {
160-
List<ClassDefinition> descendants = [];
170+
List<ModelClassDefinition> _computeDescendantClasses() {
171+
List<ModelClassDefinition> descendants = [];
161172

162173
var resolvedChildClasses =
163174
childClasses.whereType<ResolvedInheritanceDefinition>();
@@ -171,6 +182,21 @@ class ClassDefinition extends SerializableModelDefinition {
171182
}
172183
}
173184

185+
/// A [ClassDefinition] specialization that represents an exception.
186+
final class ExceptionClassDefinition extends ClassDefinition {
187+
/// Create a new [ExceptionClassDefinition].
188+
ExceptionClassDefinition({
189+
required super.className,
190+
required super.fields,
191+
required super.fileName,
192+
required super.serverOnly,
193+
required super.sourceFileName,
194+
required super.type,
195+
super.documentation,
196+
super.subDirParts,
197+
});
198+
}
199+
174200
/// Describes a single field of a [ClassDefinition].
175201
class SerializableModelFieldDefinition {
176202
/// The name of the field.
@@ -354,7 +380,7 @@ class UnresolvedInheritanceDefinition extends InheritanceDefinition {
354380
}
355381

356382
class ResolvedInheritanceDefinition extends InheritanceDefinition {
357-
final ClassDefinition classDefinition;
383+
final ModelClassDefinition classDefinition;
358384

359385
ResolvedInheritanceDefinition(this.classDefinition);
360386
}

tools/serverpod_cli/lib/src/analyzer/models/entity_dependency_resolver.dart

+26-16
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,21 @@ class ModelDependencyResolver {
1212
List<SerializableModelDefinition> modelDefinitions,
1313
) {
1414
modelDefinitions.whereType<ClassDefinition>().forEach((classDefinition) {
15-
_resolveInheritance(classDefinition, modelDefinitions);
16-
for (var fieldDefinition in classDefinition.fieldsIncludingInherited) {
17-
_resolveFieldIndexes(fieldDefinition, classDefinition);
15+
if (classDefinition is ModelClassDefinition) {
16+
_resolveInheritance(classDefinition, modelDefinitions);
17+
}
18+
19+
var fields = classDefinition is ModelClassDefinition
20+
? classDefinition.fieldsIncludingInherited
21+
: classDefinition.fields;
22+
23+
for (var fieldDefinition in fields) {
1824
_resolveProtocolReference(fieldDefinition, modelDefinitions);
1925
_resolveEnumType(fieldDefinition.type, modelDefinitions);
26+
27+
if (classDefinition is! ModelClassDefinition) continue;
28+
29+
_resolveFieldIndexes(fieldDefinition, classDefinition);
2030
_resolveObjectRelationReference(
2131
classDefinition,
2232
fieldDefinition,
@@ -32,7 +42,7 @@ class ModelDependencyResolver {
3242
}
3343

3444
static void _resolveInheritance(
35-
ClassDefinition classDefinition,
45+
ModelClassDefinition classDefinition,
3646
List<SerializableModelDefinition> modelDefinitions,
3747
) {
3848
var extendedClass = classDefinition.extendsClass;
@@ -42,7 +52,7 @@ class ModelDependencyResolver {
4252
var parentClassName = extendedClass.className;
4353

4454
var parentClass = modelDefinitions
45-
.whereType<ClassDefinition>()
55+
.whereType<ModelClassDefinition>()
4656
.where((element) => element.className == parentClassName)
4757
.firstOrNull;
4858

@@ -59,7 +69,7 @@ class ModelDependencyResolver {
5969

6070
static void _resolveFieldIndexes(
6171
SerializableModelFieldDefinition fieldDefinition,
62-
ClassDefinition classDefinition,
72+
ModelClassDefinition classDefinition,
6373
) {
6474
var indexes = classDefinition.indexes;
6575
if (indexes.isEmpty) return;
@@ -101,7 +111,7 @@ class ModelDependencyResolver {
101111
}
102112

103113
static void _resolveObjectRelationReference(
104-
ClassDefinition classDefinition,
114+
ModelClassDefinition classDefinition,
105115
SerializableModelFieldDefinition fieldDefinition,
106116
List<SerializableModelDefinition> modelDefinitions,
107117
) {
@@ -116,7 +126,7 @@ class ModelDependencyResolver {
116126
model?.type.moduleAlias == fieldDefinition.type.moduleAlias,
117127
orElse: () => null);
118128

119-
if (referenceClass is! ClassDefinition) return;
129+
if (referenceClass is! ModelClassDefinition) return;
120130

121131
var tableName = referenceClass.tableName;
122132
if (tableName is! String) return;
@@ -196,8 +206,8 @@ class ModelDependencyResolver {
196206
}
197207

198208
static void _resolveImplicitDefinedRelation(
199-
ClassDefinition classDefinition,
200-
ClassDefinition referenceDefinition,
209+
ModelClassDefinition classDefinition,
210+
ModelClassDefinition referenceDefinition,
201211
SerializableModelFieldDefinition fieldDefinition,
202212
UnresolvedObjectRelationDefinition relation,
203213
String tableName,
@@ -252,8 +262,8 @@ class ModelDependencyResolver {
252262
}
253263

254264
static void _resolveManualDefinedRelation(
255-
ClassDefinition classDefinition,
256-
ClassDefinition referenceDefinition,
265+
ModelClassDefinition classDefinition,
266+
ModelClassDefinition referenceDefinition,
257267
SerializableModelFieldDefinition fieldDefinition,
258268
UnresolvedObjectRelationDefinition relation,
259269
String tableName,
@@ -302,8 +312,8 @@ class ModelDependencyResolver {
302312
}
303313

304314
static SerializableModelFieldDefinition? _findForeignFieldByRelationName(
305-
ClassDefinition classDefinition,
306-
ClassDefinition foreignClass,
315+
ModelClassDefinition classDefinition,
316+
ModelClassDefinition foreignClass,
307317
String fieldName,
308318
String? relationName,
309319
) {
@@ -335,7 +345,7 @@ class ModelDependencyResolver {
335345
}
336346

337347
static void _resolveListRelationReference(
338-
ClassDefinition classDefinition,
348+
ModelClassDefinition classDefinition,
339349
SerializableModelFieldDefinition fieldDefinition,
340350
List<SerializableModelDefinition> modelDefinitions,
341351
) {
@@ -359,7 +369,7 @@ class ModelDependencyResolver {
359369
orElse: () => null,
360370
);
361371

362-
if (referenceClass is! ClassDefinition) return;
372+
if (referenceClass is! ModelClassDefinition) return;
363373

364374
var tableName = classDefinition.tableName;
365375
if (tableName == null) return;

tools/serverpod_cli/lib/src/analyzer/models/model_analyzer.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class SerializableModelAnalyzer {
5959

6060
switch (definitionType) {
6161
case Keyword.classType:
62-
return ModelParser.serializeClassFile(
62+
return ModelParser.serializeModelClassFile(
6363
Keyword.classType,
6464
modelSource,
6565
outFileName,
@@ -68,7 +68,7 @@ class SerializableModelAnalyzer {
6868
extraClasses,
6969
);
7070
case Keyword.exceptionType:
71-
return ModelParser.serializeClassFile(
71+
return ModelParser.serializeExceptionClassFile(
7272
Keyword.exceptionType,
7373
modelSource,
7474
outFileName,

0 commit comments

Comments
 (0)