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