generateForAnnotatedElement method

  1. @override
Future<String> generateForAnnotatedElement(
  1. Element element,
  2. ConstantReader annotation,
  3. BuildStep buildStep
)

Implement to return source code to generate for element.

This method is invoked based on finding elements annotated with an instance of T. The annotation is provided as a ConstantReader.

Supported return values include a single String or multiple String instances within an Iterable or Stream. It is also valid to return a Future of String, Iterable, or Stream.

Implementations should return null when no content is generated. Empty or whitespace-only String instances are also ignored.

Implementation

@override
Future<String> generateForAnnotatedElement(
  Element element,
  ConstantReader annotation,
  BuildStep buildStep,
) async {
  final useCases = await _loadDataFromJson<WidgetbookUseCaseData>(
    buildStep,
    '**.usecase.widgetbook.json',
    WidgetbookUseCaseData.fromJson,
  );

  final deviceFrameBuilder =
      await _loadDataFromJson<WidgetbookDeviceFrameData>(
    buildStep,
    '**.deviceframebuilder.widgetbook.json',
    WidgetbookDeviceFrameData.fromJson,
  );

  final localizationBuilder =
      await _loadDataFromJson<WidgetbookLocalizationBuilderData>(
    buildStep,
    '**.localizationbuilder.widgetbook.json',
    WidgetbookLocalizationBuilderData.fromJson,
  );

  final appBuilder = await _loadDataFromJson<WidgetbookAppBuilderData>(
    buildStep,
    '**.appbuilder.widgetbook.json',
    (json) => WidgetbookAppBuilderData.fromJson(json),
  );

  final scaffoldBuilder =
      await _loadDataFromJson<WidgetbookScaffoldBuilderData>(
    buildStep,
    '**.scaffoldbuilder.widgetbook.json',
    WidgetbookScaffoldBuilderData.fromJson,
  );

  final themeBuilder = await _loadDataFromJson<WidgetbookThemeBuilderData>(
    buildStep,
    '**.themebuilder.widgetbook.json',
    WidgetbookThemeBuilderData.fromJson,
  );

  final useCaseBuilder =
      await _loadDataFromJson<WidgetbookUseCaseBuilderData>(
    buildStep,
    '**.usecasebuilder.widgetbook.json',
    WidgetbookUseCaseBuilderData.fromJson,
  );

  final locales = await _getLocales(buildStep);
  final localizationDelegates = await _getLocalizationDelegates(buildStep);

  final name = _getName(annotation);
  final themeType = _getThemeType(annotation);
  final devices = _getDevices(annotation);
  final frames = _getFrames(annotation);
  final textScaleFactors = _getTextScaleFactors(annotation);
  final themes = await _getThemes(buildStep);
  final foldersExpanded = _getFoldersExpanded(annotation);
  final widgetsExpanded = _getWidgetsExpanded(annotation);
  final constructor = _getConstructor(annotation);

  final buffer = StringBuffer()
    ..writeln(
      generateImports(
        [
          ...themes,
          ...useCases,
          if (locales != null) locales,
        ],
      ),
    )
    ..writeln(
      generateMain(),
    )
    ..writeln(
      generateWidgetbook(
        name: name,
        constructor: constructor,
        themeTypeData: themeType,
        themes: themes,
        useCases: useCases,
        devices: devices,
        frames: frames,
        textScaleFactors: textScaleFactors,
        foldersExpanded: foldersExpanded,
        widgetsExpanded: widgetsExpanded,
        localesData: locales,
        localizationDelegatesData: localizationDelegates,
        deviceFrameBuilder:
            deviceFrameBuilder.isNotEmpty ? deviceFrameBuilder.first : null,
        localizationBuilder:
            localizationBuilder.isNotEmpty ? localizationBuilder.first : null,
        appBuilder: appBuilder.isNotEmpty ? appBuilder.first : null,
        scaffoldBuilder:
            scaffoldBuilder.isNotEmpty ? scaffoldBuilder.first : null,
        themeBuilder: themeBuilder.isNotEmpty ? themeBuilder.first : null,
        useCaseBuilder:
            useCaseBuilder.isNotEmpty ? useCaseBuilder.first : null,
      ),
    );

  return buffer.toString();
}