Open burhankhanzada opened 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; } }
Generated extension class doesn't have blank line between members