This repository was archived by the owner on Oct 2, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 129
Expand file tree
/
Copy pathclass_property.dart
More file actions
131 lines (108 loc) · 3.44 KB
/
class_property.dart
File metadata and controls
131 lines (108 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import 'package:artemis/generator/data/annotation.dart';
import 'package:artemis/generator/data/definition.dart';
import 'package:artemis/generator/data_printer.dart';
import 'package:artemis/generator/helpers.dart';
import 'package:recase/recase.dart';
/// Define a property (field) from a class.
class ClassProperty extends Definition with DataPrinter {
@override
final ClassPropertyName name;
/// The property type.
final TypeName type;
/// Some other custom annotation.
final List<Annotation> annotations;
/// Whether this parameter corresponds to the __resolveType (or equivalent)
final bool isResolveType;
/// Instantiate a property (field) from a class.
ClassProperty({
required this.name,
required this.type,
this.annotations = const [],
this.isResolveType = false,
}) : assert(hasValue(type) && hasValue(name)),
super(name: name);
/// If property is an override from super class.
bool get isOverride => annotations.contains('override');
/// Creates a copy of [ClassProperty] without modifying the original.
ClassProperty copyWith({
TypeName? type,
ClassPropertyName? name,
List<Annotation>? annotations,
bool? isResolveType,
}) =>
ClassProperty(
type: type ?? this.type,
name: name ?? this.name,
annotations: annotations ?? this.annotations,
isResolveType: isResolveType ?? this.isResolveType,
);
@override
Map<String, Object> get namedProps => {
'type': type,
'name': name,
'annotations': annotations,
'isResolveType': isResolveType,
};
}
/// Class property name
class ClassPropertyName extends Name with DataPrinter {
/// Instantiate a class property name definition.
const ClassPropertyName({required String name}) : super(name: name);
@override
String normalize(String name) {
final normalized = super.normalize(name);
final suffix = RegExp(r'.*(_+)$').firstMatch(normalized)?.group(1) ?? '';
return ReCase(super.normalize(name)).camelCase + suffix;
}
@override
Map<String, Object?> get namedProps => {
'name': name,
};
}
const _camelCaseTypes = {'bool', 'double', 'int'};
/// Type name
class TypeName extends Name with DataPrinter {
/// Instantiate a type name definition.
TypeName({
required String name,
this.isNonNull = false,
}) : super(name: name);
/// If this type is non-null
final bool isNonNull;
@override
Map<String, Object?> get namedProps => {
'name': name,
if (isNonNull) 'isNonNull': true,
};
@override
List get props => [name, isNonNull];
@override
String normalize(String name) {
final normalized = super.normalize(name);
if (_camelCaseTypes.contains(normalized)) {
return '$normalized${isNonNull ? '' : '?'}';
}
return '${ReCase(normalized).pascalCase}${isNonNull ? '' : '?'}';
}
}
/// Type name
class ListOfTypeName extends TypeName with DataPrinter {
/// Instantiate a type name definition.
ListOfTypeName({
required this.typeName,
this.isNonNull = true,
}) : super(name: typeName.name, isNonNull: isNonNull);
/// Internal type name
final TypeName typeName;
/// If this list type is non-null
@override
final bool isNonNull;
@override
Map<String, Object> get namedProps => {
'typeName': typeName,
'isNonNull': isNonNull,
};
@override
String normalize(String? name) =>
'List<${typeName.namePrintable}>${isNonNull ? '' : '?'}';
}