Files
packages.dart/deprecated/widget_gen/lib/src/class_annotation_gen.dart
T
2026-01-15 14:38:46 -08:00

87 lines
2.3 KiB
Dart

import 'dart:async';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type_system.dart';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'store_class_visitor.dart';
import 'template/widget_class_gen.dart';
import 'template/store_file.dart';
import 'type_names.dart';
class WidgetGenerator extends Generator {
//GeneratorForAnnotation<WidgetClass> {
@override
FutureOr<String> generate(LibraryReader library, BuildStep buildStep) async {
if (library.allElements.isEmpty) {
return '';
}
final typeSystem = await library.allElements.first.session.typeSystem;
final file = StoreFileTemplate()
..storeSources = _generateCodeForLibrary(library, typeSystem).toSet();
return file.toString();
}
Iterable<String> _generateCodeForLibrary(
LibraryReader library,
TypeSystem typeSystem,
) sync* {
for (final classElement in library.classes) {
yield* _generateCodeForMixinStore(
library,
classElement,
typeSystem,
);
}
}
Iterable<String> _generateCodeForMixinStore(
LibraryReader library,
ClassElement baseClass,
TypeSystem typeSystem,
) sync* {
final typeNameFinder = LibraryScopedNameFinder(library.element);
String _base;
double width, height;
if (isWidgetClass(baseClass)) {
width = getPreferredWidth(baseClass);
height = getPreferredHeight(baseClass);
if (width != null || height != null) {
_base = 'WidgetPreferredSizedBase';
} else {
_base = 'WidgetBase';
}
}
if (isPropertyClass(baseClass)) {
_base = 'PropertyBase';
}
if (_base != null) {
final _template = MixinStoreTemplate(_base)
..width = width
..height = height;
yield _generateCodeFromTemplate(
baseClass.name,
baseClass,
_template,
typeNameFinder,
);
}
}
String _generateCodeFromTemplate(
String publicTypeName,
ClassElement userStoreClass,
StoreTemplate template,
LibraryScopedNameFinder typeNameFinder,
) {
final visitor = StoreClassVisitor(publicTypeName, userStoreClass, template);
userStoreClass
..accept(visitor)
..visitChildren(visitor);
return visitor.source;
}
}