|
1 | 1 | import 'package:analyzer/dart/element/element.dart';
|
2 | 2 | import 'package:build/src/builder/build_step.dart';
|
| 3 | +import 'package:code_builder/code_builder.dart'; |
| 4 | +import 'package:dart_style/dart_style.dart'; |
3 | 5 | import 'package:source_gen/source_gen.dart';
|
4 | 6 | import 'package:dartstruct/dartstruct.dart';
|
5 | 7 |
|
6 | 8 | class DartStructGenerator extends GeneratorForAnnotation<Mapper> {
|
| 9 | + final _emitter = DartEmitter(); |
| 10 | + final _formatter = DartFormatter(); |
| 11 | + |
7 | 12 | @override
|
8 |
| - generateForAnnotatedElement( |
9 |
| - Element element, ConstantReader annotation, BuildStep buildStep) { |
10 |
| - return null; |
| 13 | + String generateForAnnotatedElement(Element element, ConstantReader annotation, BuildStep buildStep) { |
| 14 | + |
| 15 | + if (element is! ClassElement) { |
| 16 | + throw InvalidGenerationSourceError('${element.displayName} cannot be annotated with @Mapper', |
| 17 | + element: element, |
| 18 | + todo: 'Remove @Mapper annotation' |
| 19 | + ); |
| 20 | + } |
| 21 | + |
| 22 | + final classElement = element as ClassElement; |
| 23 | + |
| 24 | + if (!classElement.constructors.any((c) => c.isDefaultConstructor)) { |
| 25 | + throw InvalidGenerationSourceError('${element.displayName} must provide a default constructor', |
| 26 | + element: element, |
| 27 | + todo: 'Provide a default constructor' |
| 28 | + ); |
| 29 | + } |
| 30 | + |
| 31 | + final classBuilder = ClassBuilder() |
| 32 | + ..name = '${classElement.displayName}Impl' |
| 33 | + ..abstract = false |
| 34 | + ..extend = refer(classElement.displayName) |
| 35 | + ..methods.addAll(_generateMethods(classElement.methods)); |
| 36 | + |
| 37 | + final mapperImpl = classBuilder.build(); |
| 38 | + |
| 39 | + final code = '${mapperImpl.accept(_emitter)}'; |
| 40 | + |
| 41 | + return _formatter.format(code); |
| 42 | + |
| 43 | + } |
| 44 | + |
| 45 | + List<Method> _generateMethods(List<MethodElement> methods) { |
| 46 | + if (methods.any((method) => method.isAbstract)) { |
| 47 | + throw InvalidGenerationSourceError('Not implemented yet', |
| 48 | + todo: 'remove all methods' |
| 49 | + ); |
| 50 | + } |
| 51 | + |
| 52 | + return <Method>[]; |
11 | 53 | }
|
12 | 54 | }
|
0 commit comments