WIP: Multiple same type component usage #201
| @ -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