Skip to content

Commit ba39f03

Browse files
committed
implemented simple field mapping
1 parent d0bd9eb commit ba39f03

File tree

2 files changed

+80
-10
lines changed

2 files changed

+80
-10
lines changed

generator/lib/src/dartstruct_generator.dart

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import 'package:dartstruct_generator/src/name_provider.dart';
66
import 'package:source_gen/source_gen.dart';
77
import 'package:dartstruct/dartstruct.dart';
88
import './extensions/extensions.dart';
9+
import 'models/input_source.dart';
10+
import 'models/output_source.dart';
911

1012
class DartStructGenerator extends GeneratorForAnnotation<Mapper> {
1113
final _emitter = DartEmitter();
@@ -131,17 +133,59 @@ class DartStructGenerator extends GeneratorForAnnotation<Mapper> {
131133

132134
Code _generateMethodBody(MethodElement methodElement, NameProvider nameProvider) {
133135

134-
print(nameProvider);
136+
final firstParameter = methodElement.parameters.first;
135137

136-
final targetType = methodElement.returnType;
138+
final inputSource = InputSource(firstParameter.type, firstParameter.displayName);
137139

138-
final targetName = nameProvider.provideVariableName(targetType);
140+
final outputSource = OutputSource(methodElement.returnType, nameProvider.provideVariableName(methodElement.returnType));
139141

140-
return Block((builder) {
141-
builder
142-
..addExpression(refer(targetType.element.displayName).newInstance([]).assignFinal(targetName))
143-
..addExpression(refer(targetName).returned);
144-
});
142+
final setters = (outputSource.type.element as ClassElement).fields.where((field) => field.setter != null);
143+
144+
final blockBuilder = BlockBuilder()..addExpression(_instantiateOutputOrNull(inputSource, outputSource));
145+
146+
for (final setter in setters) {
147+
148+
final mapperExpression = _getMapperExpression(setter, inputSource);
149+
150+
if (mapperExpression != null) {
151+
final assignmentExpression = refer(outputSource.name).nullSafeProperty(setter.displayName).assign(mapperExpression);
152+
blockBuilder.addExpression(assignmentExpression);
153+
}
154+
155+
}
156+
157+
blockBuilder.addExpression(refer(outputSource.name).returned);
158+
159+
return blockBuilder.build();
160+
161+
}
162+
163+
Expression _getMapperExpression(FieldElement outputField, InputSource inputSource) {
164+
165+
final classElement = inputSource.type.element as ClassElement;
166+
final fieldName = outputField.displayName;
167+
168+
final inputFieldElement = classElement.fields.firstWhere((field) => field.displayName == fieldName && field.getter != null, orElse: () => null);
169+
170+
171+
if (inputFieldElement?.type == outputField.type) {
172+
return refer(inputSource.name).nullSafeProperty(fieldName);
173+
}
174+
175+
return null;
176+
177+
}
178+
179+
/// generate expression `final {output} = {input} == null ? null : new {output}()`
180+
Expression _instantiateOutputOrNull(InputSource input, OutputSource output) {
181+
182+
final nullValue = refer('null');
183+
final inputValue = refer(input.name);
184+
final newInstanceExpression = refer(output.type.element.displayName).newInstance([]);
185+
186+
return inputValue
187+
.equalTo(nullValue)
188+
.conditional(nullValue, newInstanceExpression).assignFinal(output.name);
145189
}
146190

147191
}

generator/lib/src/extensions/dart_type_extension.dart

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ extension DartTypeExtension on DartType {
1919

2020
bool get hasEmptyConstructor {
2121

22+
final element = this.element;
23+
2224
if (element is ClassElement) {
23-
final classElement = element as ClassElement;
2425

25-
for (final constructor in classElement.constructors) {
26+
for (final constructor in element.constructors) {
2627

2728
final hasRequiredParameter = constructor.parameters.any(_isRequiredParameter);
2829

@@ -31,6 +32,7 @@ extension DartTypeExtension on DartType {
3132
}
3233

3334
}
35+
3436
}
3537

3638
return false;
@@ -40,4 +42,28 @@ extension DartTypeExtension on DartType {
4042
bool _isRequiredParameter(ParameterElement parameterElement) {
4143
return parameterElement.isRequiredNamed || parameterElement.isRequiredPositional || parameterElement.hasRequired;
4244
}
45+
46+
List<PropertyAccessorElement> get getters {
47+
48+
final element = this.element;
49+
50+
if (element is ClassElement) {
51+
return element.accessors.where((accessor) => accessor.isGetter).toList();
52+
}
53+
54+
return <PropertyAccessorElement>[];
55+
56+
}
57+
58+
List<PropertyAccessorElement> get setters {
59+
60+
final element = this.element;
61+
62+
if (element is ClassElement) {
63+
return element.accessors.where((accessor) => accessor.isSetter).toList();
64+
}
65+
66+
return <PropertyAccessorElement>[];
67+
68+
}
4369
}

0 commit comments

Comments
 (0)