dart-lang / code_builder

A fluent API for generating valid Dart source code
https://pub.dev/packages/code_builder
BSD 3-Clause "New" or "Revised" License
423 stars 66 forks source link

Generated extension class doesn't have blank line between members #443

Open burhankhanzada opened 6 months ago

burhankhanzada commented 6 months ago

Generated extension class doesn't have blank line between members

code to generate extension class

Extension generateGoResponsiveBuildContextExtensions(List<String> names) {
  return Extension(
    (b) => b
      ..name = 'GoResponsiveBuildContextExtensions'
      ..on = const Reference('BuildContext')
      ..methods.addAll(
        [
          _generateGoResponsiveDataMethod(),
          ..._generateIsBreakpointNameMethods(names),
          _generateGoResponsiveValueMethod(names),
        ],
      ),
  );
}

Method _generateGoResponsiveDataMethod() {
  return Method(
    (p0) => p0
      ..lambda = true
      ..type = MethodType.getter
      ..name = 'goResponsiveData'
      ..returns = const Reference('GoResponsiveData')
      ..body = const Code('GoResponsive.of(this)'),
  );
}

List<Method> _generateIsBreakpointNameMethods(List<String> names) {
  var lastName = names.first;

  return names
      .map(
        (e) => _generateIsBreakpointNameMethod(
          e,
          lastName,
          (name) => lastName = name,
        ),
      )
      .toList();
}

Method _generateIsBreakpointNameMethod(
  String name,
  String lastName,
  void Function(String name) callback,
) {
  final capitalizeName =
      name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();

  var condition =
      'between(GoResponsiveBreakpoints.$lastName, GoResponsiveBreakpoints.$name,)';

  if (name == lastName) {
    condition = 'smallerOrEqualTo(GoResponsiveBreakpoints.$name)';
  }

  callback(name);

  return Method(
    (p0) => p0
      ..lambda = true
      ..type = MethodType.getter
      ..name = 'is$capitalizeName'
      ..returns = const Reference('bool')
      ..body = Code('goResponsiveData.$condition'),
  );
}

Method _generateGoResponsiveValueMethod(List<String> names) {
  final parameters = [
      ...names.map((e) {
        return Parameter(
          (p0) => p0
            ..named = true
            ..type = const Reference('T?')
            ..name = e,
        );
      }),
      Parameter(
        (p0) => p0
          ..named = true
          ..required = true
          ..type = const Reference('T')
          ..name = 'defaultValue',
      ),
    ];

  final nameString = StringBuffer();

  for (final name in names) {
    final capitalizeName =
        name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();

    nameString.writeln('''
    if(is$capitalizeName) {
      if ($name != null) return $name;
    }
    ''');
  }

  return Method(
    (p0) => p0
      ..name = 'goResponsiveValue'
      ..types.add(const Reference('T'))
      ..returns = const Reference('T')
      ..optionalParameters.addAll(parameters)
      ..body = Code('''
        $nameString
        return defaultValue;
      '''),
  );
}

generated extension class

extension GoResponsiveBuildContextExtensions on BuildContext {
  GoResponsiveData get goResponsiveData => GoResponsive.of(this);
  bool get isCompact =>
      goResponsiveData.smallerOrEqualTo(GoResponsiveBreakpoints.compact);
  bool get isMedium => goResponsiveData.between(
        GoResponsiveBreakpoints.compact,
        GoResponsiveBreakpoints.medium,
      );
  bool get isExpanded => goResponsiveData.between(
        GoResponsiveBreakpoints.medium,
        GoResponsiveBreakpoints.expanded,
      );
  T goResponsiveValue<T>({
    T? compact,
    T? medium,
    T? expanded,
    required T defaultValue,
  }) {
    if (isCompact) {
      if (compact != null) return compact;
    }

    if (isMedium) {
      if (medium != null) return medium;
    }

    if (isExpanded) {
      if (expanded != null) return expanded;
    }

    return defaultValue;
  }
}