feat(gen): add impl of proxy component generator
This commit is contained in:
parent
1797426c43
commit
e231f14162
@ -0,0 +1,101 @@
|
||||
// Copyright (C) 2023 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:analyzer/dart/element/element.dart';
|
||||
import 'package:build/build.dart';
|
||||
import 'package:source_gen/source_gen.dart';
|
||||
import 'package:wyatt_component_copy_with_extension/wyatt_component_copy_with_extension.dart';
|
||||
|
||||
class ComponentMultiProxyGenerator
|
||||
extends GeneratorForAnnotation<ComponentProxyExtension> {
|
||||
@override
|
||||
FutureOr<String> generateForAnnotatedElement(
|
||||
Element element,
|
||||
ConstantReader annotation,
|
||||
BuildStep buildStep,
|
||||
) {
|
||||
/// Check element type
|
||||
if (element is! ClassElement) {
|
||||
throw InvalidGenerationSourceError(
|
||||
'Only classes can be annotated with "CopyWith". "$element" is '
|
||||
'not a ClassElement.',
|
||||
element: element,
|
||||
);
|
||||
}
|
||||
|
||||
final classAnnotation = ComponentProxyExtension(
|
||||
skipFields: annotation.peek('skipFields')?.boolValue ?? true,
|
||||
);
|
||||
|
||||
final multiProxyClassName =
|
||||
element.displayName.replaceAll('Component', 'MultiProxy');
|
||||
final generatedCode = StringBuffer()
|
||||
..write(
|
||||
'@ComponentCopyWithExtension() class '
|
||||
'\$$multiProxyClassName extends ${element.displayName} with '
|
||||
'\$\$${multiProxyClassName}CWMixin {',
|
||||
)
|
||||
..write('final bool? freezed; '
|
||||
'final ${element.displayName} Function(BuildContext context) select;')
|
||||
..write('\$$multiProxyClassName(');
|
||||
|
||||
if (classAnnotation.skipFields ?? true) {
|
||||
generatedCode.write('this.select,');
|
||||
for (final field in element.constructors.first.parameters
|
||||
.where((element) => element.isNamed == false)) {
|
||||
generatedCode.write('super.${field.displayName},');
|
||||
}
|
||||
|
||||
generatedCode
|
||||
..write('{')
|
||||
..write('this.freezed,');
|
||||
for (final field in element.constructors.first.parameters
|
||||
.where((element) => element.isNamed)) {
|
||||
if (field.isRequiredNamed) {
|
||||
generatedCode.write('required ');
|
||||
}
|
||||
generatedCode.write('super.${field.displayName},');
|
||||
}
|
||||
generatedCode
|
||||
..write('});')
|
||||
..write(' factory \$$multiProxyClassName.multi( '
|
||||
' ${element.displayName} Function(BuildContext context) test, '
|
||||
'{bool freezed = true}) => '
|
||||
'\$$multiProxyClassName( '
|
||||
'test, '
|
||||
'freezed: freezed,); ')
|
||||
..write(
|
||||
' ${element.displayName}? compo; '
|
||||
'@override '
|
||||
'Widget build(BuildContext context) { final component = '
|
||||
'(compo ??= select(context)).copyWith.call(',
|
||||
);
|
||||
for (final field in element.constructors.first.parameters) {
|
||||
generatedCode.write('${field.displayName}:${field.displayName},');
|
||||
}
|
||||
generatedCode
|
||||
..write(');')
|
||||
..write('if (!(freezed ?? true)) { '
|
||||
'compo = null; } '
|
||||
'return component; '
|
||||
'}} ');
|
||||
}
|
||||
|
||||
return generatedCode.toString();
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user