Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
burhankhanzada opened this issue Dec 19, 2023 · 0 comments
Open

Comments

@burhankhanzada
Copy link

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;
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant