| // Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'package:code_builder/code_builder.dart'; | |
| import 'package:dart_style/dart_style.dart'; | |
| import '../generation_options.dart'; | |
| import 'import_generation.dart'; | |
| class CodeGenerator { | |
| final GenerationOptions options; | |
| final List<Spec> classes; | |
| final Iterable<String> emptyFilePaths; | |
| CodeGenerator({ | |
| required this.options, | |
| required this.classes, | |
| required this.emptyFilePaths, | |
| }); | |
| String generate() { | |
| final imports = ImportGeneration(options, emptyFilePaths).generate(); | |
| final lib = Library( | |
| (p0) => p0 | |
| ..ignoreForFile.addAll([ | |
| 'non_constant_identifier_names', | |
| 'unused_import', | |
| 'library_prefixes', | |
| ]) | |
| ..comments.add(options.header) | |
| ..directives.addAll(imports) | |
| ..body.addAll([ | |
| ...classes, | |
| if (options.pluralSelector != PluralSelectorType.custom) | |
| pluralSelector(), | |
| ]), | |
| ); | |
| final emitter = DartEmitter(orderDirectives: true); | |
| final source = '${lib.accept(emitter)}'; | |
| final code = DartFormatter().format(source); | |
| return code; | |
| } | |
| // Message Function(num, | |
| // String locale, | |
| // {Message? few, | |
| // String? locale, | |
| // Message? many, | |
| // Map<int, Message>? numberCases, | |
| // required Message other, | |
| // Map<int, Message>? wordCases}) intl; | |
| Method pluralSelector() => Method( | |
| (mb) => mb | |
| ..name = '_pluralSelector' | |
| ..returns = const Reference('Message') | |
| ..requiredParameters.addAll([ | |
| Parameter( | |
| (pb) => pb | |
| ..name = 'howMany' | |
| ..type = const Reference('num') | |
| ..named = false, | |
| ), | |
| Parameter( | |
| (pb) => pb | |
| ..name = 'locale' | |
| ..type = const Reference('String') | |
| ..named = false, | |
| ), | |
| ]) | |
| ..optionalParameters.addAll([ | |
| Parameter( | |
| (pb) => pb | |
| ..name = 'other' | |
| ..type = const Reference('Message') | |
| ..required = true | |
| ..named = true, | |
| ), | |
| Parameter( | |
| (pb) => pb | |
| ..name = 'few' | |
| ..type = const Reference('Message?') | |
| ..named = true, | |
| ), | |
| Parameter( | |
| (pb) => pb | |
| ..name = 'many' | |
| ..type = const Reference('Message?') | |
| ..named = true, | |
| ), | |
| Parameter( | |
| (pb) => pb | |
| ..name = 'numberCases' | |
| ..type = const Reference('Map<int, Message>?') | |
| ..named = true, | |
| ), | |
| Parameter( | |
| (pb) => pb | |
| ..name = 'wordCases' | |
| ..type = const Reference('Map<int, Message>?') | |
| ..named = true, | |
| ), | |
| ]) | |
| ..body = pluralSelectorBody(), | |
| ); | |
| Code pluralSelectorBody() { | |
| return switch (options.pluralSelector) { | |
| PluralSelectorType.intl => const Code(''' | |
| return Intl.pluralLogic( | |
| howMany, | |
| few: few, | |
| many: many, | |
| zero: numberCases?[0] ?? wordCases?[0], | |
| one: numberCases?[1] ?? wordCases?[1], | |
| two: numberCases?[2] ?? wordCases?[2], | |
| other: other, | |
| locale: locale, | |
| ); | |
| '''), | |
| PluralSelectorType.intl4x => const Code(''' | |
| Message getCase(int i) => numberCases?[i] ?? wordCases?[i] ?? other; | |
| return switch (Intl(locale: Locale.parse(locale)).plural().select(howMany)) { | |
| PluralCategory.zero => getCase(0), | |
| PluralCategory.one => getCase(1), | |
| PluralCategory.two => getCase(2), | |
| PluralCategory.few => few ?? other, | |
| PluralCategory.many => many ?? other, | |
| PluralCategory.other => other, | |
| }; | |
| '''), | |
| PluralSelectorType.custom => throw ArgumentError(), | |
| }; | |
| } | |
| } |