{"id":427450,"date":"2024-07-26T09:00:42","date_gmt":"2024-07-26T09:00:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=427450"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=427450","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0430 Dart\u00a03.5: \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043c\u0435\u0441\u044f\u0446 \u0444\u0443\u043b\u2011\u0442\u0430\u0439\u043c\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438. \u0418 \u0432\u043e\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/821911\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0431\u0435\u0442\u0430\u2011\u0432\u0435\u0440\u0441\u0438\u044e Dart \u0434\u043b\u044f\u00a0\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438, \u0438\u0441\u043f\u044b\u0442\u0430\u043b\u0438 \u043c\u0430\u043a\u0440\u043e\u0441 <code>@JsonCodable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Dart \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u0434\u043b\u044f\u00a0\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 hello\u2011world \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<p>\u0412\u00a0\u044d\u0442\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 <a href=\"https:\/\/pub.dev\/packages\/args_macro\" rel=\"noopener noreferrer nofollow\">\u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u043d\u0430\u00a0\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0443\u0437\u043d\u0430\u043b \u043f\u0440\u043e\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u0438\u0437\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><strong>\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e:<\/strong> \u041c\u0430\u043a\u0440\u043e\u0441\u044b \u0432\u00a0Dart \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438. \u041f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u0435\u00a0\u0431\u044b\u043b\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<h2>\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u0442\u0435<\/h2>\n<p>\u0421\u00a0\u043b\u044e\u0431\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0438 \u0443\u0436\u0435 \u0433\u043b\u044f\u0434\u044f \u043d\u0430\u00a0\u043d\u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440.<\/p>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u043a\u00a0\u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   final int count; }<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"dart\">class HelloArgsParser {   final parser = ArgParser();    HelloArgsParser() {     _addOptions();   }    void _addOptions() {     parser.addOption(\"name\", mandatory: true);     parser.addOption(\"count\", mandatory: true);   }    HelloArgs parse(List&lt;String&gt; argv) {     final wrapped = parser.parse(argv);      return HelloArgs(       name: wrapped.option(\"name\")!,       count: int.parse(wrapped.option(\"count\")!),     );   } }  augment class HelloArgs {   HelloArgs({     required this.name,     required this.count,   }); }<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/tutorial_step_1_min\" rel=\"noopener noreferrer nofollow\">\u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/a> \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e (\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0432\u0435\u0442\u043a\u0430 \u043f\u043e\u00a0\u0441\u0441\u044b\u043b\u043a\u0435). \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0435\u0433\u043e, \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0439\u0434\u0451\u043c \u0432\u00a0\u0434\u0435\u0431\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432, \u0441\u043f\u0438\u0441\u043a\u043e\u0432, enum, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438\u00a0\u0442.\u00a0\u043f. \u041d\u043e\u00a0\u043d\u0430\u0447\u043d\u0451\u043c \u0441\u00a0\u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<h2>\u0424\u0430\u0437\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432<\/h2>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441 \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u044e \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u00a0\u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u0432\u0435\u0434\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u00a0\u0443\u00a0\u043d\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u043a\u043b\u0430\u0441\u0441. \u041c\u043e\u0433\u0443\u0442\u00a0\u043b\u0438 \u043e\u043d\u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u043e\u043c? \u0412\u00a0\u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435? \u0427\u0442\u043e\u0431\u044b \u0432\u00a0\u044d\u0442\u043e\u043c\u00a0\u0431\u044b\u043b \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0440\u0438 \u0444\u0430\u0437\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432, \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0438.<\/p>\n<h3>\u0424\u0430\u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432<\/h3>\n<p>\u042d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0444\u0430\u0437\u0430. \u0412\u00a0\u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b: \u043a\u043b\u0430\u0441\u0441\u044b, mixin, enum, typedef \u0438\u00a0\u0442.\u00a0\u043f. \u041c\u0430\u043a\u0440\u043e\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043d\u0438\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043b\u044e\u0431\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0442.<\/p>\n<h3>\u0424\u0430\u0437\u0430 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439<\/h3>\n<p>\u041a\u00a0\u043d\u0430\u0447\u0430\u043b\u0443 \u0444\u0430\u0437\u044b \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439 \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0438 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0447\u043b\u0435\u043d\u044b \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u0412\u00a0\u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u00a0\u043b\u044e\u0431\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445. \u041d\u043e\u00a0\u043a\u043e\u0435\u2011\u0447\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043d\u0435\u044f\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0412\u00a0\u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"dart\">final a = b;<\/code><\/pre>\n<p><code>b<\/code> \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u043c \u0441\u00a0\u0442\u0435\u043c\u00a0\u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a\u043e\u0439\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<h3>\u0424\u0430\u0437\u0430 \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0439<\/h3>\n<p>\u041a\u00a0\u043d\u0430\u0447\u0430\u043b\u0443 \u0444\u0430\u0437\u044b \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0439 \u0432\u0441\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b, \u0438 \u0443\u0436\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0436\u0435 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043d\u0438 \u0443\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0442\u00a0\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u00a0\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043a\u00a0\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u00a0\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u042d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u043a\u043e\u0434 \u0438 \u043d\u0435\u00a0\u0437\u043d\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u043e\u00a0\u0434\u0440\u0443\u0433\u0435, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0430\u0436\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<p>\u041c\u044b \u0441\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u0435\u043c, \u0432\u00a0\u043a\u0430\u043a\u0438\u0445 \u0444\u0430\u0437\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0448 \u043c\u0430\u043a\u0440\u043e\u0441. \u042d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c.<\/p>\n<h2>\u0412\u044b\u0431\u043e\u0440 \u0444\u0430\u0437 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/h2>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u00a0\u0442\u0430\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   final int count; }<\/code><\/pre>\n<p>\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>HelloArgsParser<\/code> \u0441\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c <code>ArgParser<\/code>\u00a0\u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438\u0437 <a href=\"https:\/\/pub.dev\/packages\/args\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442\u0430 args<\/a>, \u0438 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u0432\u0435 \u0444\u0430\u0437\u044b \u0438\u0437\u00a0\u0442\u0440\u0451\u0445:<\/p>\n<ul>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>HelloArgsParser<\/code>, \u0442\u043e\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u0430 \u0444\u0430\u0437\u0430 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u044f, \u043d\u0443\u0436\u043d\u0430 \u0444\u0430\u0437\u0430 \u0438\u043b\u0438\u00a0\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439, \u0438\u043b\u0438\u00a0\u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0439. \u0421\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0444\u0430\u0437\u043e\u0439 \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0444\u0430\u0437\u0443 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:<\/p>\n<pre><code class=\"dart\">macro class Args implements ClassTypesMacro, ClassDeclarationsMacro {   @override   Future&lt;void&gt; buildTypesForClass(     ClassDeclaration clazz,     ClassTypeBuilder builder,   ) async {     \/\/ \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043b\u0430\u0441\u0441.   }      @override   Future&lt;void&gt; buildDeclarationsForClass(     ClassDeclaration clazz,     MemberDeclarationBuilder builder,   ) async {     \/\/ \u0410 \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u043f\u0430\u0440\u0441\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.   } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0444\u0430\u0437\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>ClassDefinitionsMacro<\/code>, \u043d\u0430\u043c \u043e\u043d \u043d\u0435\u00a0\u043d\u0443\u0436\u0435\u043d.<\/p>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043a\u00a0\u0434\u0440\u0443\u0433\u0438\u043c \u0432\u0435\u0449\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0440\u043e\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u00a0enum, \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>EnumTypesMacro<\/code>, <code>EnumDeclarationsMacro<\/code> \u0438\u043b\u0438 <code>EnumDefinitionsMacro<\/code>. \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043e\u043d\u0438 <a href=\"https:\/\/github.com\/dart-lang\/sdk\/blob\/main\/pkg\/_macros\/lib\/src\/api.dart\" rel=\"noopener noreferrer nofollow\">\u0432\u00a0API<\/a>.<\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<ol>\n<li>\n<p>\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d \u0432\u044b\u0437\u0432\u0430\u043d.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u043b\u0434\u0435\u0440, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0434\u043b\u044f\u00a0\u0444\u0430\u0437\u044b. \u0422\u0438\u043f \u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u043a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043c\u0430\u043a\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0430\u0437\u0435.<\/p>\n<\/li>\n<\/ol>\n<h2>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/h2>\n<p>\u042d\u0442\u043e \u043b\u0435\u0433\u043a\u043e:<\/p>\n<pre><code class=\"dart\">@override Future&lt;void&gt; buildTypesForClass(   ClassDeclaration clazz,   ClassTypeBuilder builder, ) async {   final name = clazz.identifier.name;   final parserName = _getParserName(clazz);    builder.declareType(     name,     DeclarationCode.fromString('class $parserName {}\\n'),   ); }  String _getParserName(ClassDeclaration clazz) {   final name = clazz.identifier.name;   return '${name}Parser'; }<\/code><\/pre>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u0443\u0441\u0442\u044b\u043c. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0447\u043b\u0435\u043d\u0430\u043c\u0438, \u043d\u043e\u00a0\u043d\u0430\u043c \u043f\u043e\u0447\u0442\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u00a0\u043f\u043e\u043b\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0430\u0437\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u00a0\u0440\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0441\u0440\u0430\u0437\u0443 \u0432\u00a0\u0444\u0430\u0437\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439.<\/p>\n<h2>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/h2>\n<p>\u0412\u00a0\u0444\u0430\u0437\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<ol>\n<li>\n<p>\u0423\u0437\u043d\u0430\u0442\u044c \u0432\u0441\u0451 \u043e\u00a0\u043f\u043e\u043b\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u0430\u0440\u0441\u0438\u043b, \u0430\u00a0\u043d\u0435\u00a0\u0431\u044b\u043b \u043f\u0443\u0441\u0442\u044b\u043c.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"dart\">@override Future&lt;void&gt; buildDeclarationsForClass(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   final intr = await _introspect(clazz, builder);    await _declareConstructor(clazz, builder);   _augmentParser(builder, intr); }<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e\u00a0\u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438 \u0432\u0441\u0451 \u043e\u00a0\u043f\u043e\u043b\u044f\u0445 \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u044d\u0442\u043e \u0432\u00a0\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>intr<\/code>, \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u043b\u0430.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430<\/h2>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0441\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043d\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0433\u043e.<\/p>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/common_macros\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441 <\/a><code>@Constructor()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 \u0431\u0435\u0440\u0451\u0442 \u043d\u0430\u00a0\u0441\u0435\u0431\u044f \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043b\u043e\u0447\u0435\u0439 \u0438 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0435 <code>Args<\/code> \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\u00a0\u043b\u0438\u0448\u044c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<pre><code class=\"dart\">Future&lt;void&gt; _declareConstructor(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   await const Constructor().buildDeclarationsForClass(clazz, builder); }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043e\u0434\u0438\u043d \u043c\u0430\u043a\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439. \u041c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u043e\u0442\u00a0\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0431\u0438\u043b\u0434\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u043d\u0438\u0447\u0435\u043c \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0430\u043c\u0438.<\/p>\n<h2>\u041f\u0440\u043e\u0445\u043e\u0434\u044b \u043f\u043e \u043f\u043e\u043b\u044f\u043c<\/h2>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044f\u043c \u0434\u0432\u0430 \u0440\u0430\u0437\u0430:<\/p>\n<ol>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u044e \u0432 <code>ArgParser<\/code> \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u00a0\u043f\u0430\u0440\u0441\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u043a\u0430\u0436\u0434\u044b\u043c \u043f\u043e\u043b\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0435\u0433\u043e \u0442\u0438\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/visitor\" rel=\"noopener noreferrer nofollow\">\u0448\u0430\u0431\u043b\u043e\u043d Visitor<\/a>, \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e\u00a0\u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"dart\">abstract class ArgumentVisitor&lt;R&gt; {   R visitInt(IntArgument argument);   R visitString(StringArgument argument); }<\/code><\/pre>\n<p>\u0418 \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"dart\">sealed class Argument {   Argument({     required this.intr,     required this.optionName,   });    final FieldIntrospectionData intr;   final String optionName;    R accept&lt;R&gt;(ArgumentVisitor&lt;R&gt; visitor); }  class IntArgument extends Argument {   IntArgument({     required super.intr,     required super.optionName,   });    @override  R accept&lt;R&gt;(ArgumentVisitor&lt;R&gt; visitor) {     return visitor.visitInt(this);   } }  \/\/ \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f StringArgument.<\/code><\/pre>\n<h2>\u0418\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f<\/h2>\n<h3>\u041a\u043b\u0430\u0441\u0441 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438<\/h3>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438: \u043e\u00a0\u043f\u043e\u043b\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043e\u0431\u00a0\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u0445 \u0434\u043b\u044f\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0445 \u0432\u00a0\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438\u00a0\u0442.\u00a0\u043f.<\/p>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u0430\u00a0\u043d\u0435\u00a0\u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041d\u0430\u0437\u043e\u0432\u0451\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 <code>IntrospectionData<\/code>:<\/p>\n<pre><code class=\"dart\">Future&lt;IntrospectionData&gt; _introspect(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   final fields = await builder.introspectFields(clazz);   final ids = await ResolvedIdentifiers.resolve(builder);   final arguments = await _fieldsToArguments(fields, builder);    return IntrospectionData(     arguments: arguments,     clazz: clazz,     fields: fields,     ids: ids,   ); }<\/code><\/pre>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u00a0\u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043e\u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f, \u0447\u0442\u043e\u00a0\u044f \u0432\u044b\u043d\u0435\u0441 \u0435\u0451 \u0432\u00a0\u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">macro_util<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Map \u0438\u0437\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u00a0\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043d\u0438\u0445:<\/p>\n<pre><code class=\"dart\">final fields = await builder.introspectFields(clazz);<\/code><\/pre>\n<p>\u042d\u0442\u043e extension\u2011\u043c\u0435\u0442\u043e\u0434. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a\u00a0\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u044d\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c <code>ClassDeclaration<\/code>, \u0442\u043e \u0432\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"dart\">final List&lt;FieldDeclaration&gt; fields = await builder.fieldsOf(type);  for (final field in fields) {   \/\/ \u0414\u0435\u043b\u0430\u0435\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c. }<\/code><\/pre>\n<h3>FieldDeclaration<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u00a0\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0438\u0441\u043a\u0430. \u042d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u0432\u0438\u0434\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0438\u0437\u00a0\u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044f. \u0412\u00a0\u044d\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>hasConst<\/code>, <code>hasFinal<\/code>, <code>hasStatic<\/code>, <code>hasInitializer<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0434\u043b\u044f\u00a0\u043d\u0430\u0441\u00a0\u2014 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>type<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>TypeAnnotation<\/code>.<\/p>\n<h3>TypeAnnotation<\/h3>\n<p>\u042d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043e\u00a0\u0442\u0438\u043f\u0435 \u043f\u043e\u043b\u044f \u0431\u0435\u0437\u00a0\u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u041e\u043d \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439, \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043f\u043e\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f:<br \/><code>Foo foo;<\/code><br \/>\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>NamedTypeAnnotation<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>Foo<\/code>, \u043d\u0435\u00a0\u0432\u043d\u0438\u043a\u0430\u044f \u0432\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f:<br \/><code>var a = 1;<\/code><br \/>\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>OmittedTypeAnnotation<\/code>. \u0412\u00a0\u043d\u0451\u043c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e, \u043d\u043e\u00a0\u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u043e\u0439, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u0432\u00a0\u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0444\u0430\u0437\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f\u00a0\u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u0438\u0445:<br \/><code>final (a, b) = getRecord();<\/code><br \/>\u041d\u043e\u00a0\u043d\u0430\u043c \u044d\u0442\u043e \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e\u00a0\u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u043b\u0435 \u0443\u00a0\u043d\u0430\u0441 <code>type<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>NamedTypeAnnotation<\/code> \u0438 \u0432\u044b\u0434\u0430\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u00a0\u0442\u0430\u043a.<\/p>\n<h3>NamedTypeAnnotation<\/h3>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e <code>NamedTypeAnnotation<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u00a0\u0431\u0430\u0437\u043e\u0432\u043e\u043c\u0443 <code>TypeAnnotation<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>identifier<\/code>. \u0414\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f:<br \/><code>Foo foo;<\/code> <br \/>\u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 <code>Identifier<\/code>.<\/p>\n<h3>Identifier<\/h3>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430\u00a0\u2014 \u044d\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432\u00a0\u043a\u043e\u0434\u0435. \u041f\u043e\u00a0\u0441\u0443\u0442\u0438 \u043e\u043d\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0438\u0434\u0435\u044e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u0442\u0438\u043f, \u0433\u0434\u0435\u2011\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439.<\/p>\n<p>\u0412\u00a0\u0442\u0430\u043a\u043e\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438:<br \/><code>Foo foo;<\/code><br \/>\u0432 <code>namedTypeAnnotation.identifier<\/code> \u0431\u0443\u0434\u0435\u0442 \u00abFoo\u00bb\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0438\u0434\u0435\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0432\u043e\u00a0\u0447\u0442\u043e\u2011\u0442\u043e.<\/p>\n<p>\u0410\u00a0\u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435:<br \/><code>print();<\/code><br \/>\u0432\u00a0\u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0434\u0451\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code>print<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435.<\/p>\n<p>\u0412\u00a0\u043e\u0431\u0449\u0435\u043c, \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438 \u0438\u0434\u0435\u044e.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <code>NamedTypeAnnotation<\/code> \u0441 <code>Identifier<\/code>, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <code>name<\/code> \u0440\u0430\u0432\u0435\u043d \u00abString\u00bb \u0438\u043b\u0438 \u00abint\u00bb, \u0442\u043e \u043c\u044b \u043d\u0430\u0448\u043b\u0438, \u0447\u0442\u043e\u00a0\u0445\u043e\u0442\u0435\u043b\u0438\u00a0\u2014 \u043f\u043e\u00a0\u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0434\u043b\u044f\u00a0\u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>\u0422\u0430\u043c \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e\u00a0\u0431\u044b\u0432\u0430\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>typedef<\/code>. \u0412\u0441\u0451 \u044d\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u0437\u0436\u0435, \u0430\u00a0\u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430\u00a0\u044d\u0442\u043e\u043c. \u0412\u043e\u0442 \u043f\u0430\u043c\u044f\u0442\u043a\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/041\/f76\/b53\/041f76b5383520d1be59ffd9c3d33e8a.png\" width=\"1400\" height=\"630\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/041\/f76\/b53\/041f76b5383520d1be59ffd9c3d33e8a.png\"\/><\/figure>\n<p>\u0418 \u0435\u0449\u0451 \u0440\u0430\u0437: <a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442 macro_util<\/a> \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u0437\u0430\u00a0\u0432\u0430\u0441.<\/p>\n<h2>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432<\/h2>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u043a\u0430\u043a\u00a0\u0432\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>print<\/code>, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u00a0\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435?<\/p>\n<p>\u0422\u0443\u0442 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e\u00a0\u0434\u043b\u044f\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432. \u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u044b <code>ArgParser<\/code>, <code>List<\/code>, <code>String<\/code> \u0438 <code>int<\/code>. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432\u00a0\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435:<\/p>\n<pre><code class=\"dart\">class Libraries {   static final arg_parser = Uri.parse('package:args\/src\/arg_parser.dart');   static final core = Uri.parse('dart:core'); }  class ResolvedIdentifiers {   ResolvedIdentifiers({     required this.ArgParser,     required this.int,     required this.List,     required this.String,   });    final Identifier ArgParser;   final Identifier int;   final Identifier List;   final Identifier String;    static Future&lt;ResolvedIdentifiers&gt; resolve(     MemberDeclarationBuilder builder,   ) async {     final (       ArgParser,       int,       List,       String,     ) = await (       builder.resolveIdentifier(Libraries.arg_parser, 'ArgParser'),       builder.resolveIdentifier(Libraries.core, 'int'),       builder.resolveIdentifier(Libraries.core, 'List'),       builder.resolveIdentifier(Libraries.core, 'String'),     ).wait;      return ResolvedIdentifiers(       ArgParser: ArgParser,       int: int,       List: List,       String: String,     );   } }<\/code><\/pre>\n<p>\u0412\u00a0\u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0431\u0440\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code>ArgParser<\/code> \u0438\u0437\u00a0\u0435\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>package:args\/args.dart<\/code>. \u041d\u043e <a href=\"https:\/\/github.com\/dart-lang\/sdk\/issues\/55910\" rel=\"noopener noreferrer nofollow\">\u0431\u0430\u0433<\/a> \u043c\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443:<br \/><code>'package:args\/src\/arg_parser.dart'<\/code><\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u00a0\u0442\u0430\u043a\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 <code>ResolvedIdentifiers<\/code>. \u041c\u043e\u0436\u043d\u043e\u00a0\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u043e\u0440\u043e\u0447\u0435? \u0412\u00a0\u043d\u0451\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044f, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u0430\u00a0\u043f\u043e\u0442\u043e\u043c \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u00a0\u043d\u0438\u0445 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0438\u043f\u043e\u0432\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. \u042d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c? \u0415\u0441\u043b\u0438\u00a0\u0431\u044b \u0442\u043e\u043b\u044c\u043a\u043e\u2026<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/933\/7ab\/df4\/9337abdf4d8f0180e035547a510c182f.png\" width=\"1400\" height=\"770\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/933\/7ab\/df4\/9337abdf4d8f0180e035547a510c182f.png\"\/><\/figure>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435, \u043c\u044b \u043a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043f\u0440\u043e\u0449\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u0438\u0437\u0443\u0447\u0438\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043d\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430!<\/p>\n<p>\u042f <a href=\"https:\/\/github.com\/alexeyinkin\/dart-macro-util\/blob\/main\/lib\/src\/macros\/resolve_identifiers\/resolve_identifiers.dart\" rel=\"noopener noreferrer nofollow\">\u0441\u0434\u0435\u043b\u0430\u043b \u043c\u0430\u043a\u0440\u043e\u0441<\/a>, \u0441\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0434\u043e\u00a0\u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre><code class=\"dart\">@ResolveIdentifiers() class ResolvedIdentifiers {   @Resolve('package:args\/args.dart')   final Identifier ArgParser;    final Identifier int;   final Identifier List;   final Identifier String; }  \/\/ ...  final ids = ResolvedIdentifiers.resolve(builder);<\/code><\/pre>\n<p>\u041e\u043d \u0432\u00a0\u0442\u043e\u043c\u00a0\u0436\u0435 <a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442\u0435 macro_util<\/a>. \u041d\u043e\u00a0\u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0414\u043b\u044f\u00a0\u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 <code>int<\/code>, <code>List<\/code> \u0438 <code>String<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0448\u0438\u0442\u044c, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u0432\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u043d\u043e <code>ArgParser<\/code> \u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0\u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u00a0\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043a\u00a0\u043f\u043e\u043b\u044e, \u043d\u043e <a href=\"https:\/\/github.com\/dart-lang\/language\/issues\/3847\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0435\u0439<\/a>.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 <code>@ResolveIdentifiers()<\/code> \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0438 \u043d\u0430\u043c \u0432\u0441\u0451\u2011\u0442\u0430\u043a\u0438 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 <code>ResolvedIdentifiers<\/code> \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041d\u043e\u00a0\u044f \u0440\u0430\u0434, \u0447\u0442\u043e\u00a0\u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0435\u00a0\u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f.<\/p>\n<h2>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0438 \u0432\u0438\u0437\u0442\u043e\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u00a0\u043f\u043e\u043b\u0435\u0439 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b <code>StringArgument<\/code> \u0438 <code>IntArgument<\/code>:<\/p>\n<pre><code class=\"dart\">Map&lt;String, Argument&gt; _fieldsToArguments(   Map&lt;String, FieldIntrospectionData&gt; fields,   DeclarationBuilder builder, ) {   return {     for (final entry in fields.entries)       entry.key: _fieldToArgument(         entry.value as ResolvedFieldIntrospectionData,         builder: builder,       ),   }; }  Argument _fieldToArgument(   ResolvedFieldIntrospectionData fieldIntr, {   required DeclarationBuilder builder, }) {   final typeDecl = fieldIntr.deAliasedTypeDeclaration;   final optionName = _camelToKebabCase(fieldIntr.name);   final typeName = typeDecl.identifier.name;    switch (typeName) {     case 'int':       return IntArgument(         intr: fieldIntr,         optionName: optionName,       );      case 'String':       return StringArgument(         intr: fieldIntr,         optionName: optionName,       );   }        throw Exception(); }<\/code><\/pre>\n<h2>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u0430<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u0430. \u041d\u0430\u0447\u043d\u0451\u043c \u0441\u00a0\u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"dart\">void _augmentParser(   MemberDeclarationBuilder builder,   IntrospectionData intr, ) {   final parserName = _getParserName(intr.clazz);    builder.declareInLibrary(     DeclarationCode.fromParts([       \/\/       'augment class $parserName {\\n',       '  final parser = ', intr.ids.ArgParser, '();\\n',       ..._getConstructor(intr.clazz),       ...AddOptionsGenerator(intr).generate(),       ...ParseGenerator(intr).generate(),       '}\\n',     ]),   ); }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443\u00a0\u043d\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u0441\u044f. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e\u00a0\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u00ab\u0447\u0430\u0441\u0442\u0438\u00bb \u043a\u043e\u0434\u0430 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e\u043b\u0435 <code>parser<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u043a\u043e\u0440\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u043e\u043f\u0446\u0438\u044f\u043c\u0438, \u0438 \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439.<\/p>\n<h3>\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043e\u043f\u0446\u0438\u044f\u043c\u0438<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>AddOptionsGenerator<\/code> \u044d\u0442\u043e \u0432\u0438\u0437\u0438\u0442\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>_addOptions()<\/code>:<\/p>\n<pre><code class=\"dart\">List&lt;Object&gt; _getConstructor(ClassDeclaration clazz) {   final parserName = _getParserName(clazz);    return [     \/\/     parserName, '() {\\n',     '  _addOptions();\\n',     '}\\n',   ]; }  class AddOptionsGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   AddOptionsGenerator(this.intr);    final IntrospectionData intr;    List&lt;Object&gt; generate() {     return [       \/\/       'void _addOptions() {\\n',       for (final argument in intr.arguments.values)         ...[...argument.accept(this), '\\n'],       '}\\n',     ];   }    @override   List&lt;Object&gt; visitInt(IntArgument argument) =&gt;     _visitStringInt(argument);    @override  List&lt;Object&gt; visitString(StringArgument argument) =&gt;     _visitStringInt(argument);    List&lt;Object&gt; _visitStringInt(Argument argument) {     return [       \/\/       'parser.addOption(\\n',       '  ${jsonEncode(argument.optionName)},\\n',       '  mandatory: true,\\n',       ');\\n',     ];   } }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 <code>_addOptions()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u0430.<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430<\/h3>\n<p>\u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0448 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u00a0\u2014 <code>ParseGenerator<\/code>:<\/p>\n<pre><code class=\"dart\">class ParseGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   ParseGenerator(this.intr);    final IntrospectionData intr;    List&lt;Object&gt; generate() {     final name = intr.clazz.identifier.name;     final ids = intr.ids;      return [       \/\/       '$name parse(', ids.List, '&lt;', ids.String, '&gt; argv) {\\n',       '  final wrapped = parser.parse(argv);\\n',       '  return $name(\\n',       for (final argument in intr.arguments.values) ...[         ...argument.accept(this),         ',\\n',       ],       '  );\\n',       '}\\n',     ];   }    @override   List&lt;Object&gt; visitInt(IntArgument argument) {     return [       argument.intr.name,       ': ',       intr.ids.int,       '.parse(wrapped.option(${jsonEncode(argument.optionName)})!)',     ];   }    @override  List&lt;Object&gt; visitString(StringArgument argument) {     return [       argument.intr.name,       ': wrapped.option(${jsonEncode(argument.optionName)})!',     ];   } }<\/code><\/pre>\n<p>\u0412\u0441\u0451, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f!<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 main.dart:<\/p>\n<pre><code class=\"dart\">import 'macro.dart';  @Args() class HelloArgs {   final String name;   final int count; }  void main(List&lt;String&gt; argv) {   final parser = HelloArgsParser(); \/\/ \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441.   final HelloArgs args = parser.parse(argv);    for (int n = 0; n &lt; args.count; n++) {     print('Hello, ${args.name}!');   } }<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0435\u0433\u043e:<\/p>\n<pre><code>$ dart run --enable-experiment=macros lib\/main.dart --name=Alexey --count=3 Hello, Alexey! Hello, Alexey! Hello, Alexey!<\/code><\/pre>\n<p>\u0418&#8230; \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043c\u043e\u0440\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439!<\/p>\n<h2>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h2>\n<p>\u041d\u0430\u0448 \u043c\u0430\u043a\u0440\u043e\u0441 \u043f\u043e\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0432\u00a0\u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0430\u00a0\u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043d\u0435\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final Map map; }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_fieldToArgument<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0410\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0435 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0432\u00a0\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e\u00a0\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430:<\/p>\n<ol>\n<li>\n<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0434\u0430\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/h3>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code class=\"dart\">builder.report(   Diagnostic(     DiagnosticMessage(       'My error',       target: fieldDeclaration.asDiagnosticTarget,     ),     Severity.error,   ), );<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code>$ dart run --enable-experiment=macros lib\/min.dart --name=Alexey --count=3 lib\/min.dart:5:16: Error: My error   final String name;                ^ lib\/min.dart:6:13: Error: My error   final int count;             ^<\/code><\/pre>\n<p><a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">\u041f\u0430\u043a\u0435\u0442 macro_util<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u0447\u0443\u0442\u044c \u043a\u043e\u0440\u043e\u0447\u0435:<\/p>\n<pre><code class=\"dart\">builder.reportError(   'My error',   target: fieldDeclaration.asDiagnosticTarget, );<\/code><\/pre>\n<h3>\u041e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c<\/h3>\n<ul>\n<li>\n<p>\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u044f \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438, \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 <code>int<\/code> \u0438 <code>String<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u044f \u0441\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/tutorial_step_2_errors\" rel=\"noopener noreferrer nofollow\">\u0412\u043e\u0442 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0438. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 diff \u0441\u00a0\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e\u00a0\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0cf\/559\/df7\/0cf559df795e8327990d7ca00775ac7e.png\" width=\"1400\" height=\"860\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0cf\/559\/df7\/0cf559df795e8327990d7ca00775ac7e.png\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e\u00a0\u044d\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u0421\u043a\u0440\u044b\u0442\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/h3>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. \u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435\u2011\u0442\u043e \u0438\u0437\u00a0\u044d\u0442\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043c\u044b \u043d\u0435\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c, \u0442\u043e \u043c\u044b \u0432\u00a0\u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u00a0\u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. \u0418\u043d\u0430\u0447\u0435 \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439:<\/p>\n<pre><code class=\"dart\">static var _silenceUninitializedError;<\/code><\/pre>\n<p>\u0423\u00a0\u043d\u0435\u0451 \u0442\u0438\u043f <code>dynamic<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u00a0\u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u00a0\u043b\u044e\u0431\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u0430, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u043e\u00a0\u043c\u044b \u043d\u0435\u00a0\u0434\u043e\u0439\u0434\u0451\u043c \u0434\u043e\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0432\u044b\u0434\u0430\u0434\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435<br \/><code>null as dynamic<\/code> <br \/>\u041d\u043e\u00a0\u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code>dynamic<\/code>, \u0430\u00a0\u043c\u043d\u0435 \u043d\u0435\u00a0\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0430\u00a0\u043a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u0439\u043c\u0451\u043c, \u0447\u0442\u043e\u00a0\u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u0432\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0435\u0441\u043b\u0438 \u0443\u00a0\u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e <code>StringArgument<\/code> \u0438 <code>IntArgument<\/code>? \u041d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>InvalidTypeArgument<\/code> (\u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f\u00a0\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0434 <code>int<\/code> \u0438 <code>String<\/code>):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/948\/97c\/307\/94897c3073071bcb3f62bc5a985e1c13.png\" width=\"1400\" height=\"632\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/948\/97c\/307\/94897c3073071bcb3f62bc5a985e1c13.png\"\/><\/figure>\n<pre><code class=\"dart\">class InvalidTypeArgument extends Argument {   InvalidTypeArgument({     required super.intr,   }) : super(           optionName: '',         );    @override  R accept&lt;R&gt;(ArgumentVisitor&lt;R&gt; visitor) {     return visitor.visitInvalidType(this);   } }<\/code><\/pre>\n<p>\u0418 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u043e\u0431\u0430 \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u044d\u0442\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u041a\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u0446\u0438\u0438 \u0432\u00a0\u043f\u0430\u0440\u0441\u0435\u0440, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<pre><code class=\"dart\">class AddOptionsGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   \/\/ ...    @override   List&lt;Object&gt; visitInvalidType(InvalidTypeArgument argument) {     return const [];   } }<\/code><\/pre>\n<p>\u0410\u00a0\u043a\u043e\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0432\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0443 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443:<\/p>\n<pre><code class=\"dart\">class ParseGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   \/\/ ...    @override  List&lt;Object&gt; visitInvalidType(InvalidTypeArgument argument) {     return [       argument.intr.name,       ': _silenceUninitializedError',     ];   } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b <code>InvalidTypeArgument<\/code> \u0432\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043e\u043a, \u0430\u00a0\u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043d\u043e\u0433\u043e:<\/p>\n<pre><code class=\"dart\">Argument _fieldToArgument(   FieldIntrospectionData fieldIntr, {   required DeclarationBuilder builder, }) async {   final field = fieldIntr.fieldDeclaration;   final target = field.asDiagnosticTarget;   final type = field.type;    void reportError(String message) {     builder.reportError(message, target: target);   }    void unsupportedType() {     if (type is OmittedTypeAnnotation) {       reportError('An explicitly declared type is required here.');       return;     }        reportError('The only allowed types are: String, int.');   }    if (fieldIntr is! ResolvedFieldIntrospectionData) {     unsupportedType();     return InvalidTypeArgument(intr: fieldIntr);   }    final typeDecl = fieldIntr.deAliasedTypeDeclaration;   final optionName = _camelToKebabCase(fieldIntr.name);    if (field.hasInitializer) {     reportError('Initializers are not allowed for argument fields.');     return InvalidTypeArgument(intr: fieldIntr);   }    if (typeDecl.library.uri != Libraries.core) {     unsupportedType();     return InvalidTypeArgument(intr: fieldIntr);   }    final typeName = typeDecl.identifier.name;    switch (typeName) {     case 'int':       return IntArgument(         intr: fieldIntr,         optionName: optionName,       );      case 'String':       return StringArgument(         intr: fieldIntr,         optionName: optionName,       );   }    unsupportedType();   return InvalidTypeArgument(intr: fieldIntr); }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u0440\u043e\u043c\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439. \u0421\u043a\u043e\u0440\u043e \u0434\u043e\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0438 \u0434\u043e\u00a0\u043d\u0438\u0445, \u0430\u00a0\u043f\u043e\u043a\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 <code>TypeDeclaration<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438.<\/p>\n<h2>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 TypeDeclaration \u0443 \u043f\u043e\u043b\u044f<\/h2>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>int<\/code> \u043e\u0442\u00a0\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e:<\/p>\n<pre><code class=\"dart\">class int {}  @Args() class HelloArgs {   final int count; \/\/ \u041b\u043e\u0436\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 'int'. }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430. \u041d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u043f\u043e\u043d\u044f\u0442\u044c, \u0438\u0437\u00a0\u043a\u0430\u043a\u043e\u0439 \u043e\u043d \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0415\u0441\u043b\u0438 \u0438\u0437 <code>dart:core<\/code>, \u0442\u043e \u0432\u0441\u0451 \u0432\u00a0\u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0430\u00a0\u0438\u043d\u0430\u0447\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442 macro_util<\/a> \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u044e \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043d\u0430\u0448\u0443 \u043f\u0430\u043c\u044f\u0442\u043a\u0443 \u043f\u043e\u00a0\u0442\u0438\u043f\u0430\u043c? \u0423\u00a0\u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/617\/3da\/337\/6173da337ef3b26cd89ee1033104e728.png\" width=\"1400\" height=\"1011\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/617\/3da\/337\/6173da337ef3b26cd89ee1033104e728.png\"\/><\/figure>\n<h3>TypeDeclaration<\/h3>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 <code>Identifier<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043c\u044f \u00abString\u00bb \u0438\u043b\u0438 \u00abint\u00bb? \u041a\u0440\u043e\u043c\u0435 \u0438\u043c\u0435\u043d\u0438 \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0449\u0451 \u0438 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d. \u0418 \u0432\u043e\u0442 \u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0443\u0437\u043d\u0430\u0442\u044c:<\/p>\n<pre><code class=\"dart\">final typeDecl = await builder.typeDeclarationOf(   namedTypeAnnotation.identifier, );<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>TypeDeclaration<\/code>. \u041e\u043d \u0432\u044b\u0433\u043e\u0434\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 <code>TypeAnnotation<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439\u00a0\u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0442\u0438\u043f, \u0432\u044b\u0442\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u0438\u0437\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u042d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442\u00a0\u0442\u0438\u043f\u0430.<\/p>\n<p>\u0412\u00a0\u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>ClassDeclaration<\/code>. \u042d\u0442\u043e \u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0441\u00a0\u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043a\u043e\u043f\u0430\u0442\u044c. \u041d\u043e\u00a0\u0442\u043e\u0433\u0434\u0430 \u0443\u00a0\u043d\u0430\u0441\u00a0\u0431\u044b\u043b <code>ClassDeclaration<\/code> \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u043c\u0430\u043a\u0440\u043e\u0441, \u0430\u00a0\u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0443\u00a0\u043d\u0430\u0441 \u0434\u043b\u044f\u00a0\u0442\u0438\u043f\u0430 \u043f\u043e\u043b\u044f. \u041a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u044d\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451 \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.<\/p>\n<p>\u0415\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f <code>EnumDeclaration<\/code>. \u041c\u044b \u0432\u0435\u0434\u044c \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c enum \u0434\u043b\u044f\u00a0\u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430. \u042d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441\u00a0\u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<\/p>\n<p>\u0415\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f <code>TypeAliasDeclaration<\/code>, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u043f\u043e\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>typedef<\/code>. \u0412\u00a0\u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0442\u0438\u043f, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f, \u0438 \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e\u00a0\u0432\u0441\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 <code>typedef<\/code>\u00a0\u2014 \u0432\u0435\u0434\u044c \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u00a0\u0442\u0438\u043f\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c. \u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"dart\">TypeDeclaration typeDecl = await builder.typeDeclarationOf(   namedTypeAnnotation.identifier, );  while (typeDecl is TypeAliasDeclaration) {   final aliasedType = typeDecl.aliasedType;   if (aliasedType is! NamedTypeAnnotation) {     \/\/ Error. The typedef has led us to something weird like     \/\/ a record:         final (a, b) = getRecord();     \/\/ or a function:    final void Function() function;     throw Exception('...');   }   typeDecl = await builder.typeDeclarationOf(aliasedType.identifier); }<\/code><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>FieldIntrospectionData.deAliasedTypeDeclaration<\/code>.<\/p>\n<h3>Library<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <code>TypeDeclaration<\/code>, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430. \u0418 \u0432\u043e\u0442 \u0442\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 <code>int<\/code> \u043e\u0442\u00a0\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e.<\/p>\n<p><a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">\u041f\u0430\u043a\u0435\u0442 macro_util package<\/a> \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e. \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0442\u043e \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d <code>ResolvedFieldIntrospectionData<\/code> \u0441\u043e \u0432\u0441\u0435\u0439 \u043d\u0443\u0436\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u0438\u043d\u0430\u0447\u0435\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e <code>FieldIntrospectionData<\/code> \u0441\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u043c <code>TypeAnnotation<\/code>.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043d\u0430\u0437\u0432\u0430\u043b\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 <code>ResolvedTypeArgument<\/code>.<\/p>\n<h2>\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f<\/h2>\n<p>\u0427\u0442\u043e\u00a0\u0435\u0441\u043b\u0438 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0435?<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String _name; }<\/code><\/pre>\n<p>\u0412\u00a0Dart \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441\u00a0\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u043a\u0440\u043e\u0441, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f\u00a0\u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u0445 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043c.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <code>InvalidTypeArgument<\/code> \u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"dart\">Argument _fieldToArgument(   FieldIntrospectionData fieldIntr, {   required DeclarationBuilder builder, }) {   final field = fieldIntr.fieldDeclaration;   final target = field.asDiagnosticTarget;    if (fieldIntr.name.contains('_')) {     builder.reportError(       'An argument field name cannot contain an underscore.',       target: target,     );     return InvalidTypeArgument(intr: fieldIntr);   }    \/\/ ...<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u0434\u043b\u044f\u00a0\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"dart\">class ParseGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   ParseGenerator(this.intr);    final IntrospectionData intr;    List&lt;Object&gt; generate() {     final name = intr.clazz.identifier.name;     final ids = intr.ids;      final arguments = intr.arguments.values.where(       (a) =&gt;         a.intr.constructorHandling ==         FieldConstructorHandling.namedOrPositional,     );      return [       \/\/       '$name parse(', ids.List, '&lt;', ids.String, '&gt; argv) {\\n',       '  final wrapped = parser.parse(argv);\\n',       '  return $name(\\n',       for (final param in _getPositionalParams()) ...[...param, ',\\n'],       for (final argument in arguments) ...[         ...argument.accept(this),         ',\\n',       ],       '  );\\n',       '}\\n',     ];   }    List&lt;List&lt;Object&gt;&gt; _getPositionalParams() {     final result = &lt;List&lt;Object&gt;&gt;[];     final fields = intr.fields.values.where(       (f) =&gt; f.constructorHandling == FieldConstructorHandling.positional,     );      for (final _ in fields) {       result.add([         '_silenceUninitializedError',       ]);     }      return result;   }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e<br \/><code>FieldIntrospectionData.constructorHandling<\/code><\/p>\n<p>\u041e\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u043e \u0438\u0437\u00a0\u0434\u0432\u0443\u0445:<\/p>\n<ul>\n<li>\n<p><code>positional<\/code>, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><code>namedOrPositional<\/code> \u0432\u00a0\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u00a0\u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0430\u043a\u043e\u043d\u0435\u0446\u2011\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u041e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/h2>\n<p>\u041d\u0430\u0448 \u043c\u0430\u043a\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u0438 \u0441\u0435\u0442\u044b \u0438\u0437 <code>int<\/code> \u0438 <code>String<\/code>. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f65\/0a4\/c15\/f650a4c15b8ce5fab585976f03280f4b.png\" width=\"1400\" height=\"631\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f65\/0a4\/c15\/f650a4c15b8ce5fab585976f03280f4b.png\"\/><\/figure>\n<p>\u0412\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e\u00a0\u2014 <a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/tutorial_step_3_iterables\" rel=\"noopener noreferrer nofollow\">\u0432\u00a0\u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u043a\u0435<\/a>. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 diff \u0441\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0442\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e\u00a0\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dec\/87a\/e4b\/dec87ae4b411168ecc1a7fc3c592703c.png\" width=\"1400\" height=\"1030\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dec\/87a\/e4b\/dec87ae4b411168ecc1a7fc3c592703c.png\"\/><\/figure>\n<p>\u0412\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043a\u043b\u0430\u0441\u0441\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u00a0\u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0430\u0445, \u043d\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u043f\u0440\u043e\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u044b. \u0421\u00a0\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0432\u0430\u0436\u043d\u043e \u0432\u043e\u0442 \u0447\u0442\u043e.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0448\u043b\u0438 List \u0438\u043b\u0438\u00a0Set, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0433\u043e <code>typeArguments<\/code>. \u042d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 <code>NamedTypeAnnotation<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u0438\u043f \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043b\u044f\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u0436\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043a\u043e\u043f\u043d\u0443\u0442\u044c \u0432\u00a0\u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u00a0\u2014 \u043a\u0430\u043a\u00a0\u043c\u044b \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u0438\u00a0\u2014 \u0438 \u0433\u043e\u0442\u043e\u0432\u043e:<\/p>\n<pre><code class=\"dart\">Future&lt;Argument&gt; _fieldToArgument(   FieldIntrospectionData fieldIntr, {   required DeclarationBuilder builder, }) async {   \/\/ ...    if (type is! NamedTypeAnnotation) {     unsupportedType();     return InvalidTypeArgument(intr: fieldIntr);   }    \/\/ ...    switch (typeName) {     \/\/ ...      case 'List':     case 'Set':       final paramType = type.typeArguments.firstOrNull;        if (paramType == null) {         reportError(           'A $typeName requires a type parameter: '           '$typeName&lt;String&gt;, $typeName&lt;int&gt;.',         );         return InvalidTypeArgument(intr: fieldIntr);       }        if (paramType.isNullable) {         reportError(           'A $typeName type parameter must be non-nullable because each '           'element is either parsed successfully or breaks the execution.',         );         return InvalidTypeArgument(intr: fieldIntr);       }        if (paramType is! NamedTypeAnnotation) {         unsupportedType();         return InvalidTypeArgument(intr: fieldIntr);       }        final paramTypeDecl = await builder.deAliasedTypeDeclarationOf(paramType);        if (paramTypeDecl.library.uri != Libraries.core) {         unsupportedType();         return InvalidTypeArgument(intr: fieldIntr);       }        switch (paramTypeDecl.identifier.name) {         case 'int':           return IterableIntArgument(             intr: fieldIntr,             iterableType: IterableType.values.byName(typeName.toLowerCase()),             optionName: optionName,           );          case 'String':           return IterableStringArgument(             intr: fieldIntr,             iterableType: IterableType.values.byName(typeName.toLowerCase()),             optionName: optionName,           );       }        \/\/ ...<\/code><\/pre>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Enum<\/h2>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 enum \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final Fruit fruit; }  enum Fruit { apple, banana, mango, orange }<\/code><\/pre>\n<p>\u041f\u043e\u00a0\u0438\u0434\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044e \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>EnumDeclaration<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>ClassDeclaration<\/code>. \u041d\u043e\u00a0\u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e. \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>ClassDeclaration<\/code> \u0434\u0430\u0436\u0435 \u0432\u00a0\u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u041f\u043e\u2011\u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e\u00a0\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c.<\/p>\n<p>\u041d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0444\u043b\u0430\u0433. \u041a\u043e\u0433\u0434\u0430 API \u043d\u0430\u0447\u043d\u0451\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c <code>EnumDelcaration<\/code>, \u044d\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0436\u0434\u0451\u0442 <code>ClassDeclaration<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u0441\u00a0\u044d\u0442\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u00a0\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Enum<\/code>. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0443\u0436\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u043b\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432\u00a0\u043d\u0430\u0448\u0443 \u043f\u0430\u043c\u044f\u0442\u043a\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c93\/a7a\/306\/c93a7a3060c12eda6a5c5bf58638da34.png\" width=\"1400\" height=\"1151\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c93\/a7a\/306\/c93a7a3060c12eda6a5c5bf58638da34.png\"\/><\/figure>\n<h3>StaticType<\/h3>\n<p>\u042d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u00a0\u0434\u0440\u0443\u0433\u0438\u043c <code>StaticType<\/code> \u043d\u0430\u00a0\u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0440\u0443\u0434\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0437\u0430\u0447\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0430 <code>ClassDeclaration<\/code>. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, <code>StaticType<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438. \u041e\u043d \u043e\u0434\u043d\u0430\u043a\u043e\u00a0\u0436\u0435 \u043d\u0435\u00a0\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>StaticType<\/code>, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0431\u0438\u043b\u0434\u0435\u0440 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c <code>NamedTypeAnnotationCode<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"dart\">final staticType = await builder.resolve(   NamedTypeAnnotationCode(name: namedTypeAnnotation.identifier), );  if (await staticType.isSubtypeOf(enumStaticType)) {   \/\/ ... }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 <a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/tutorial_step_4_enums\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0440\u0441\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 enum<\/a>. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 diff \u0441\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a6\/075\/707\/1a60757079aa2f6a52dd8537a036a593.png\" width=\"1400\" height=\"942\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1a6\/075\/707\/1a60757079aa2f6a52dd8537a036a593.png\"\/><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 StaticType<\/h3>\n<p><a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">\u041f\u0430\u043a\u0435\u0442 macro_utils<\/a> \u0431\u0435\u0440\u0451\u0442 \u043d\u0430\u00a0\u0441\u0435\u0431\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e <code>StaticType<\/code> \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>Enum<\/code>.<\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442\u00a0\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434, \u0447\u0442\u043e\u00a0\u0438 \u0441\u00a0\u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>ResolvedIdentifiers<\/code>, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\u00a0\u2014 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e <code>StaticType<\/code> \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d:<\/p>\n<pre><code class=\"dart\">import 'package:macros\/macros.dart';  import 'resolved_identifiers.dart';  class StaticTypes {   StaticTypes({     required this.Enum,   });    final StaticType Enum;    static Future&lt;StaticTypes&gt; resolve(     MemberDeclarationBuilder builder,     ResolvedIdentifiers ids,   ) async {     final Enum = await builder.resolve(NamedTypeAnnotationCode(name: ids.Enum));      return StaticTypes(       Enum: Enum,     );   } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u00a0\u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"dart\">class IntrospectionData {   IntrospectionData({     required this.arguments,     required this.clazz,     required this.fields,     required this.ids,     required this.staticTypes, \/\/                      \u041d\u041e\u0412\u041e\u0415   });    final Map&lt;String, Argument&gt; arguments;   final ClassDeclaration clazz;   final Map&lt;String, FieldIntrospectionData&gt; fields;   final ResolvedIdentifiers ids;   final StaticTypes staticTypes; \/\/                    \u041d\u041e\u0412\u041e\u0415 }<\/code><\/pre>\n<p>\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"dart\">Future&lt;IntrospectionData&gt; _introspect(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   final ids = await ResolvedIdentifiers.resolve(builder);    final (fields, staticTypes) = await (     builder.introspectFields(clazz),     StaticTypes.resolve(builder, ids), \/\/                  \u041d\u041e\u0412\u041e\u0415   ).wait;    final arguments = await _fieldsToArguments(     fields,     builder: builder,     staticTypes: staticTypes, \/\/                           \u041d\u041e\u0412\u041e\u0415   );      return IntrospectionData(     arguments: arguments,     clazz: clazz,     fields: fields,     ids: ids,     staticTypes: staticTypes, \/\/                           \u041d\u041e\u0412\u041e\u0415   ); }<\/code><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 enum<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u0438\u043f \u043d\u0435\u00a0\u0438\u0437 <code>dart:core<\/code>, \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c enum, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:<\/p>\n<pre><code class=\"dart\">Future&lt;Argument&gt; _fieldToArgument(   FieldIntrospectionData fieldIntr, {   required DeclarationBuilder builder,   required StaticTypes staticTypes, }) async {   \/\/ ...    if (typeDecl.library.uri != Libraries.core) {     if (await fieldIntr.nonNullableStaticType.isSubtypeOf(staticTypes.Enum)) {       return EnumArgument(         enumIntr:         await builder.introspectEnum(fieldIntr.deAliasedTypeDeclaration),         intr: fieldIntr,         optionName: optionName,       );     }      unsupportedType();     return InvalidTypeArgument(intr: fieldIntr);   }    \/\/ ...    switch (typeName) {     \/\/ ...      case 'List':     case 'Set':       \/\/ ...        if (paramTypeDecl.library.uri != Libraries.core) {         final paramStaticType = await builder.resolve(paramType.code);         if (await paramStaticType.isSubtypeOf(staticTypes.Enum)) {           return IterableEnumArgument(             enumIntr: await builder.introspectEnum(paramTypeDecl),             intr: fieldIntr,             iterableType: IterableType.values.byName(typeName.toLowerCase()),             optionName: optionName,           );         }          unsupportedType();         return InvalidTypeArgument(intr: fieldIntr);       }        \/\/ ...<\/code><\/pre>\n<h3>\u0418\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 enum<\/h3>\n<p>\u041c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 extension\u2011\u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u00a0\u0431\u0438\u043b\u0434\u0435\u0440\u0435:<\/p>\n<pre><code class=\"dart\">class EnumIntrospectionData {   EnumIntrospectionData({     required this.deAliasedTypeDeclaration,     required this.values,   });    final TypeDeclaration deAliasedTypeDeclaration;   final List&lt;EnumConstantIntrospectionData&gt; values; }  class EnumConstantIntrospectionData {   const EnumConstantIntrospectionData({     required this.name,   });    final String name; }  extension EnumIntrospectionExtension on DeclarationBuilder {   Future&lt;EnumIntrospectionData&gt; introspectEnum(     TypeDeclaration deAliasedTypeDeclaration,   ) async {     final fields = await fieldsOf(deAliasedTypeDeclaration);      final values = (await Future.wait(fields.map(introspectEnumField)))         .nonNulls         .toList(growable: false);      return EnumIntrospectionData(       deAliasedTypeDeclaration: deAliasedTypeDeclaration,       values: values,     );   }    Future&lt;EnumConstantIntrospectionData?&gt; introspectEnumField(     FieldDeclaration field,   ) async {     final type = field.type;      if (type is NamedTypeAnnotation) {       return null;     }      return EnumConstantIntrospectionData(       name: field.identifier.name,     );   } }<\/code><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b\u00a0\u0431\u044b\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>builder.valuesOf(enumDeclaration)<\/code>, \u043d\u043e\u00a0\u0443\u00a0\u043d\u0430\u0441 \u043d\u0435\u0442 <code>EnumDeclaration<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435. \u041a\u00a0\u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432\u0441\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b enum \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e <code>values<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0440\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043f\u043e\u043b\u044f, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f \u044d\u0442\u043e <code>NamedTypeAnnotation<\/code>\u00a0\u2014 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 false \u0434\u043b\u044f <code>values<\/code>. \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435\u00a0\u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u00a0enum \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u043e\u00a0\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u00a0\u043a\u0440\u0430\u0439\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f\u00a0\u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e \u043d\u0435\u00a0\u0432\u0445\u043e\u0434\u0438\u0442 \u0432 <a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442 macro_util<\/a> \u0438\u0437\u2011\u0437\u0430 \u043d\u0435\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0422\u0430\u043a \u0438\u043b\u0438\u00a0\u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 <code>EnumIntrospectionData<\/code> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0435\u0433\u043e \u0432 <code>EnumArgument<\/code>:<\/p>\n<pre><code class=\"dart\">class EnumArgument extends ResolvedTypeArgument {   EnumArgument({     required super.intr,     required super.optionName,     required this.enumIntr,   });    final EnumIntrospectionData enumIntr;    @override   R accept&lt;R&gt;(ArgumentVisitor&lt;R&gt; visitor) {     return visitor.visitEnum(this);   } }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u0446\u0438\u0438 \u0432\u00a0\u043f\u0430\u0440\u0441\u0435\u0440:<\/p>\n<pre><code class=\"dart\">class AddOptionsGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   \/\/ ...    @override   List&lt;Object&gt; visitEnum(EnumArgument argument) {     final values =       argument.enumIntr.values.map((v) =&gt; v.name).toList(growable: false);      return [       \/\/       'parser.addOption(\\n',       '  ${jsonEncode(argument.optionName)},\\n',       '  allowed: ${jsonEncode(values)},\\n',       '  mandatory: true,\\n',       ');\\n',     ];   }    \/\/ ...<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435\u00a0\u2014 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"dart\">class ParseGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   \/\/ ...    @override   List&lt;Object&gt; visitEnum(EnumArgument argument) {     final valueGetter = _getOptionValueGetter(argument);      return [       argument.intr.name,       ': ',       argument.intr.deAliasedTypeDeclaration.identifier,       '.values.byName($valueGetter!)',     ];   }    \/\/ ...<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u00a0\u0436\u0435 \u0434\u043b\u044f <code>IterableEnumArgument<\/code>.<\/p>\n<h2>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0438 nullable-\u043f\u043e\u043b\u044f<\/h2>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0430\u043c\u044b\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final int count = 1; }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0435\u0440\u0438\u0442\u044c <a href=\"https:\/\/github.com\/dart-lang\/language\/blob\/main\/working\/augmentation-libraries\/feature-specification.md\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"dart\">augment class HelloArgs {   augment final int count = _parse_count(augmented);    static int _parse_count(int defaultValue) {     \/\/ \u041f\u0430\u0440\u0441\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435.   } }<\/code><\/pre>\n<p>\u041d\u043e\u00a0\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e, \u0438 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0438\u0441\u043a\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u0434\u0435\u044f\u00a0\u2014 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <code>final<\/code>  \u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u043f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044f \u0431\u0435\u0437\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435 \u043f\u043e\u043b\u044f \u0441\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u042d\u0442\u043e \u0433\u0440\u044f\u0437\u043d\u043e\u0432\u0430\u0442\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435\u00a0\u0441\u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0451\u2011\u0442\u0430\u043a\u0438 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b.<\/p>\n<p>\u041d\u043e\u00a0\u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u00a0\u0432\u044b\u0437\u043e\u0432\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u0439 <code>ArgParser.addOption(defaultsTo: ...)<\/code>, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u00a0\u0441\u043f\u0440\u0430\u0432\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0430\u0440\u0441\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b, \u043d\u043e\u00a0API \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442\u00a0\u043b\u0438\u0448\u044c \u0443\u0437\u043d\u0430\u0442\u044c, \u0435\u0441\u0442\u044c\u00a0\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u043e\u043e\u0431\u0449\u0435, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e. \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u0443\u0439\u0442\u0435 \u0437\u0430 <a href=\"https:\/\/github.com\/dart-lang\/sdk\/issues\/56297\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441<\/a>, \u0435\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u00a0\u043f\u043e\u043b\u044f\u043c\u0438 \u0431\u0435\u0437\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0447\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u00a0\u043f\u043e\u043b\u044f\u0445 \u0441\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u043e\u043a\u2011\u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432\u00a0\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043a\u0430\u043a\u0438\u0435\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432\u00a0\u0432\u044b\u0437\u043e\u0432\u044b <code>addOption(defaultsTo: ...)<\/code> \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043a\u2011\u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 nullable\u2011\u043f\u043e\u043b\u0435\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 null\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u00a0\u043e\u0434\u0438\u043d \u0437\u0430\u0445\u043e\u0434.<\/p>\n<p><a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/tutorial_step_5_initializers\" rel=\"noopener noreferrer nofollow\">\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c<\/a> \u0432\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 null. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 diff \u0441\u00a0\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e\u00a0\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e23\/f7b\/770\/e23f7b770e1cfeb0e9a997528f648451.png\" width=\"1400\" height=\"855\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e23\/f7b\/770\/e23f7b770e1cfeb0e9a997528f648451.png\"\/><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430<\/h3>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>MockDataObjectGenerator<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0434\u0435\u043b\u0430\u043b \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443:<\/p>\n<pre><code class=\"dart\">Future&lt;void&gt; _declareConstructors(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   await Future.wait([     const Constructor().buildDeclarationsForClass(clazz, builder),     MockDataObjectGenerator.createMockConstructor(clazz, builder), \/\/ NEW   ]); }<\/code><\/pre>\n<pre><code class=\"dart\">const _constructorName = 'withDefaults';  class MockDataObjectGenerator {   \/\/\/ Creates the constructor on the data class which does not have   \/\/\/ parameters for fields that have initializers   \/\/\/ thus keeping them from being overwritten.   static Future&lt;void&gt; createMockConstructor(     ClassDeclaration clazz,     MemberDeclarationBuilder builder,   ) async {     return const Constructor(       name: _constructorName,       skipInitialized: true,     ).buildDeclarationsForClass(clazz, builder);   } }<\/code><\/pre>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441 <code>@Constructor<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043c\u044f \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u044f \u0441\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438. \u0422\u0430\u043a \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u043d\u0435\u00a0\u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u043a-\u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0437\u00a0\u043d\u0435\u0433\u043e \u0442\u0440\u0435\u0442\u0438\u0439 <code>ArgumentVisitor<\/code>:<\/p>\n<pre><code class=\"dart\">\/\/\/ Generates code to create an instance of the data class that \/\/\/ does not overwrite the fields that have initializers. \/\/\/ \/\/\/ This mock object is then used as the source of data \/\/\/ for options that were not passed. \/\/\/ \/\/\/ The required fields are filled with dummy values of the respective types \/\/\/ since they will never be used because the actual values for them \/\/\/ will be parsed when constructing the end-instance of the data class. class MockDataObjectGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt;     with PositionalParamGenerator {    \/\/ ...    List&lt;Object&gt; generate() {     final name = intr.clazz.identifier.name;     final arguments = intr.arguments.values.where(       (a) =&gt;         a.intr.constructorOptionality ==           FieldConstructorOptionality.required &amp;&amp;         a.intr.constructorHandling ==           FieldConstructorHandling.namedOrPositional,     );      return [       'static final $fieldName = $name.$_constructorName(\\n',       for (final param in getPositionalParams()) ...[...param, ',\\n'],       for (final parts in arguments.map((argument) =&gt; argument.accept(this)))         ...[...parts, ',\\n'],       ');\\n',     ];   }    @override   List&lt;Object&gt; visitEnum(EnumArgument argument) {     return [       argument.intr.name,       ': ',       argument.intr.deAliasedTypeDeclaration.identifier,       '.values.first',     ];   }    @override   List&lt;Object&gt; visitInt(IntArgument argument) {     return [       argument.intr.name,       ': 0',     ];   }    @override   List&lt;Object&gt; visitInvalidType(InvalidTypeArgument argument) {     return [       argument.intr.name,       ': _silenceUninitializedError',     ];   }    @override   List&lt;Object&gt; visitIterableEnum(IterableEnumArgument argument) =&gt;     _visitIterable(argument);    @override   List&lt;Object&gt; visitIterableInt(IterableIntArgument argument) =&gt;     _visitIterable(argument);    @override   List&lt;Object&gt; visitIterableString(IterableStringArgument argument) =&gt;     _visitIterable(argument);    @override   List&lt;Object&gt; visitString(StringArgument argument) {     return [       argument.intr.name,       ': \"\"',     ];   }    List&lt;Object&gt; _visitIterable(IterableArgument argument) {     switch (argument.iterableType) {       case IterableType.list:         return [           argument.intr.name,           ': const []',         ];        case IterableType.set:         return [           argument.intr.name,           ': const {}',         ];     }   } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u00a0\u043d\u0430\u0441 \u0434\u0432\u0430 \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u00a0\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 <code>getPositionalParameters<\/code>  <code>mixin PositionalParamGenerator<\/code>.<\/p>\n<p>\u0412\u043e\u0442 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0438\u043b\u0438\u0439 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0447\u0442\u043e\u0431\u044b \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0435\u00a0\u043f\u0443\u0433\u0430\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0430 \u0432\u00a0\u043d\u0430\u0448 \u043c\u0430\u043a\u0440\u043e\u0441:<\/p>\n<pre><code class=\"dart\">void _augmentParser(   MemberDeclarationBuilder builder,   IntrospectionData intr, ) {   final parserName = _getParserName(intr.clazz);    builder.declareInLibrary(     DeclarationCode.fromParts([       \/\/       'augment class $parserName {\\n',       '  final parser = ', intr.ids.ArgParser, '();\\n',       '  static var _silenceUninitializedError;\\n',       ...MockDataObjectGenerator(intr).generate(), \/\/     \u041d\u041e\u0412\u041e\u0415       ..._getConstructor(intr.clazz),       ...AddOptionsGenerator(intr).generate(),       ...ParseGenerator(intr).generate(),       '}\\n',     ]),   ); }<\/code><\/pre>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 <code>ArgParser<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u043f\u0446\u0438\u044e, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"dart\">class AddOptionsGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt; {   \/\/ ...    List&lt;Object&gt; _visitStringInt(Argument argument) {     final field = argument.intr.fieldDeclaration;      return [       \/\/       'parser.addOption(\\n',       '  \"${argument.optionName}\",\\n',       if (field.hasInitializer) ...[            \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         '  defaultsTo: ',                       \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         MockDataObjectGenerator.fieldName,      \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         '.',                                    \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         argument.intr.name,                     \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         '.toString()',                          \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         ',\\n',                                  \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e       ] else if (!field.type.isNullable)        \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         '  mandatory: true,\\n',                 \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e       ');\\n',     ];   }      \/\/ ...<\/code><\/pre>\n<p>\u0418 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c null:<\/p>\n<pre><code class=\"dart\">class ParseGenerator extends ArgumentVisitor&lt;List&lt;Object&gt;&gt;     with PositionalParamGenerator {   \/\/ ...    @override   List&lt;Object&gt; visitInt(IntArgument argument) {     final valueGetter = _getOptionValueGetter(argument);      return [       argument.intr.name,       ': ',       if (argument.intr.fieldDeclaration.type.isNullable)  \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e         '$valueGetter == null ? null : ',                  \/\/ \u0418\u0417\u041c\u0415\u041d\u0415\u041d\u041e       intr.ids.int,       '.parse($valueGetter!)',     ];   }    \/\/ ...<\/code><\/pre>\n<p>\u041a\u0430\u043a\u00a0\u0432\u0438\u0434\u0438\u0442\u0435, \u043d\u0430\u043c \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e\u00a0\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>ArgParser<\/code> \u0441\u0430\u043c \u0432\u0435\u0440\u043d\u0451\u0442 \u043d\u0430\u043c \u0438\u043b\u0438\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u0432\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0438\u043b\u0438\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<h3>\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u00a0\u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435. \u0412\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final List&lt;int?&gt;? list = []; }<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u0442\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0435 \u0441\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c <code>final<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0438\u0437\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c nullable, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0443\u0441\u0442\u044b\u043c, \u0435\u0441\u043b\u0438 \u043d\u0435\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u00a0\u044d\u0442\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f \u0432\u00a0\u0441\u043f\u0438\u0441\u043a\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c nullable, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0438\u043b\u0438\u00a0\u043b\u043e\u043c\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u0434\u0430\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0438\u0437\u00a0\u044d\u0442\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442 \u0435\u0451, \u043d\u043e\u00a0\u0441\u0440\u0430\u0437\u0443\u00a0\u0436\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0432\u0442\u043e\u0440\u0443\u044e. \u041e\u043d \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442 \u0435\u0451, \u043d\u043e\u00a0\u0441\u0440\u0430\u0437\u0443\u00a0\u0436\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0442\u0440\u0435\u0442\u044c\u044e. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435, \u0430\u00a0\u043c\u0430\u043a\u0440\u043e\u0441 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043f\u0440\u0438\u0432\u0435\u0440\u0435\u0434\u043b\u0438\u0432\u044b\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u043e\u00a0\u0432\u0441\u0435\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438. \u0418 \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434 \u043d\u0430\u00a0\u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   List&lt;int&gt; list = []; }<\/code><\/pre>\n<p>\u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u0447\u0435\u0437\u0430\u0442\u044c \u043e\u0434\u043d\u0430 \u0437\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u0439, \u0438 \u044d\u0442\u043e\u00a0\u2014 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u0412\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u044e\u0449\u0435\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043b\u0430\u0433 <code>isValid<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435\u00a0\u0442\u0430\u043a, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 <code>false<\/code>, \u043d\u043e\u00a0\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0412\u00a0\u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0444\u043b\u0430\u0433 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043b\u0438 <code>InvalidTypeArgument<\/code>, \u0438\u043b\u0438\u00a0\u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043e\u0442 \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 diff, \u0442\u0430\u043c \u0438\u0445 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435):<\/p>\n<pre><code class=\"dart\">bool isValid = true;  if (field.hasInitializer &amp;&amp; field.hasFinal) {   reportError(     'A field with an initializer cannot be final '     'because it needs to be overwritten when parsing the argument.',   );    isValid = false; }  \/\/ ...<\/code><\/pre>\n<p>\u0423\u00a0\u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0440\u0430\u0437\u0432\u0435\u0442\u0432\u043b\u0451\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431\u00a0\u043e\u0448\u0438\u0431\u043a\u0430\u0445.<\/p>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u00a0\u0444\u043b\u0430\u0433\u043e\u043c <code>--help<\/code>, \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u043f\u043e\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a\u2011\u0442\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u044b. \u041d\u043e\u00a0\u043a\u0430\u043a?<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435\u00a0\u2014 \u0432\u00a0\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   \/\/\/ Your name to print.   final String name;    \/\/\/ How many times to print your name.   final int count = 1; }<\/code><\/pre>\n<pre><code>$ dart run --enable-experiment=macros lib\/min.dart --help Usage: [arguments]     --name (mandatory)    Your name to print.     --count               (defaults to \"1\") How many times to print your name. -h, --help                Print this usage information.<\/code><\/pre>\n<p>\u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0441\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u00a0\u043f\u043e\u043b\u044f\u043c. \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u0443\u0439\u0442\u0435 \u0437\u0430 <a href=\"https:\/\/github.com\/dart-lang\/sdk\/issues\/55953\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a>, \u0435\u0441\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u00a0\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0430\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u00a0\u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u00a0\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u0445 \u043a\u00a0\u043f\u043e\u043b\u044f\u043c:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   @Arg(help: 'Your name to print.')   final String name;    @Arg(help: 'How many times to print your name.')   final int count = 1; }<\/code><\/pre>\n<p>\u041d\u0435\u00a0\u0442\u0430\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u043e\u00a0\u0442\u0430\u043a\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u0439, \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d <code>int<\/code>, \u0438\u00a0\u0442.\u00a0\u043f.<\/p>\n<p>\u041d\u043e\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u044b <a href=\"https:\/\/github.com\/dart-lang\/language\/issues\/3847\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>\u041e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c\u00a0\u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044f\u0445\u2011\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u0445:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   static const _nameHelp = 'Your name to print.';    int count = 1;   static const _countHelp = 'How many times to print your name.'; }<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/tutorial_step_6_usage\" rel=\"noopener noreferrer nofollow\">\u0412\u00a0\u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u043a\u0435<\/a> \u0432\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 diff \u0441\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0442\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e\u00a0\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/849\/696\/7ea\/8496967ea7f8503461d3a62cb85a3132.png\" width=\"1400\" height=\"1006\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/849\/696\/7ea\/8496967ea7f8503461d3a62cb85a3132.png\"\/><\/figure>\n<p>\u0410\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0435:<\/p>\n<ol>\n<li>\n<p>\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f (\u043f\u0440\u043e\u0448\u043b\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430\u00a0\u043d\u0438\u0445 \u043b\u043e\u043c\u0430\u043b\u0430\u0441\u044c).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f\u2011\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u043b\u0435\u0439<\/h2>\n<p>\u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   var count = 1; \/\/ \u041d\u0435\u044f\u0432\u043d\u044b\u0439 \u0442\u0438\u043f int. }<\/code><\/pre>\n<p>\u0418 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0445\u043e\u0442\u0435\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   final count = 1; \/\/ \u041d\u0435\u044f\u0432\u043d\u044b\u0439 \u0442\u0438\u043f int. }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0444\u0430\u0437\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432. \u041d\u043e, \u043a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u00a0\u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0430\u0437\u0435:<\/p>\n<pre><code class=\"dart\">builder.declareInLibrary(   DeclarationCode.fromParts([     'augment class $parserName {',     \/\/ ...   ]), );<\/code><\/pre>\n<p>\u0410\u00a0\u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u043b\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0432\u00a0\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441, \u043d\u0430\u0437\u0432\u0430\u0432 \u0435\u0433\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>@ArgsParser<\/code>, \u0438 \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u043a\u043b\u0430\u0441\u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0432\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u041d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u00a0\u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043b\u0438. \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u043e <a href=\"https:\/\/github.com\/dart-lang\/sdk\/issues\/56042\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e<\/a>. \u0418 \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u00a0\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0451\u043d, \u043d\u043e\u00a0\u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u00a0\u043d\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435\u00a0\u0441\u043c\u043e\u0436\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u00a0\u0438\u0434\u0435\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043a\u0430\u043a\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   final int count; }  void main(List&lt;String&gt; argv) {   final args = HelloArgs.parse(argv); }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441, \u043d\u043e\u00a0\u043c\u043d\u0435 \u043d\u0435\u00a0\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u043c\u0435\u0442\u043e\u0434\u0443 <code>parse<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f.<\/p>\n<p>\u0423\u00a0\u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u044f \u0438\u0434\u0435\u044f: \u0432\u0437\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u043e\u00a0\u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442\u00a0\u0436\u0435 \u043c\u0430\u043a\u0440\u043e\u0441 <code>@Args<\/code> \u0438 \u0434\u043b\u044f\u00a0\u043a\u043b\u0430\u0441\u0441\u0430\u2011\u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0442\u043e\u0436\u0435. \u041c\u0430\u043a\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u00a0\u043a\u0430\u043a\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442, \u0438 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437\u00a0\u0434\u0432\u0443\u0445 \u0440\u0430\u0431\u043e\u0442. \u042d\u0442\u043e \u0433\u0440\u044f\u0437\u043d\u043e\u0432\u0430\u0442\u043e, \u043d\u043e\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u044b\u043c \u0447\u0438\u0441\u0442\u044b\u043c.<\/p>\n<p>\u042f \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u0440\u0435\u0448\u0438\u043b, \u043f\u043e\u0434\u043e\u0436\u0434\u0443 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 API, \u043a\u043e\u0433\u0434\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438. \u041f\u043e\u043a\u0430 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u043e\u0449\u0435, \u0442\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"dart\">final typeAnnotation = await builder.inferType(omittedTypeAnnotation);<\/code><\/pre>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432<\/h2>\n<h3>\u042e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b<\/h3>\n<ol>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043c\u043e\u043a <code>ClassDeclaration<\/code> \u0438 \u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0430\u043c \u0444\u0430\u0437\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u00a0\u043a\u043e\u0434\u0435 \u0442\u0435\u0441\u0442\u0430 \u0438 \u0432\u044b\u0437\u043e\u0432\u0438\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e\u00a0\u043c\u0430\u043a\u0440\u043e\u0441 \u0432\u044b\u0437\u0432\u0430\u043b \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u043a\u0430 \u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0443\u0441\u0438\u043b\u0438\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 <code>StaticType<\/code>. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u0442\u0443\u0442 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u0438\u0442 \u043e\u0442\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart.<\/p>\n<h3>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b<\/h3>\n<p>\u0412\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Args<\/code> \u044d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435:<\/p>\n<ol>\n<li>\n<p>\u041f\u0438\u0448\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 stdout \u0438 stderr.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043e\u0437\u044c\u043c\u0438\u0442\u0435 <a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/main\" rel=\"noopener noreferrer nofollow\">\u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u0430 args_macro<\/a>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a\u00a0\u0432\u00a0\u043d\u0435\u0439 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u00a0\u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043e\u0434\u0435\u043b\u0430\u043d\u044b \u0432\u0441\u0435 \u043c\u0435\u043b\u043e\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u00a0\u0445\u0432\u0430\u0442\u0430\u043b\u043e: \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b <code>double<\/code>, \u0444\u043b\u0430\u0433\u0438 <code>bool<\/code> \u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u043e\u00a0\u044d\u0442\u043e \u0432\u0441\u0451 \u043d\u0435\u00a0\u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 diff:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b11\/879\/443\/b11879443f8021ba640a65efdc3450c9.png\" width=\"1400\" height=\"1377\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b11\/879\/443\/b11879443f8021ba640a65efdc3450c9.png\"\/><\/figure>\n<p>\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0432 <a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/blob\/main\/test\/args_macro_test.dart\" rel=\"noopener noreferrer nofollow\">args_macro_test.dart<\/a><\/p>\n<p>\u0412 <a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/main\/example\/lib\" rel=\"noopener noreferrer nofollow\">example\/lib<\/a> \u043c\u043d\u043e\u0433\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043e\u0442\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0436\u0434\u0451\u043c \u0438\u043b\u0438\u00a0\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0438\u043b\u0438\u00a0\u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/h3>\n<p><a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/blob\/main\/example\/lib\/main.dart\" rel=\"noopener noreferrer nofollow\">main.dart<\/a>\u00a0\u2014 \u0434\u043b\u0438\u043d\u043d\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 30\u00a0\u0432\u0438\u0434\u0430\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c.<\/p>\n<p>\u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043b\u0438\u00a0\u0441\u00a0\u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438\u00a0\u2014 \u0441\u043c\u043e\u0442\u0440\u044f \u0447\u0442\u043e\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435. \u0415\u0451 \u0442\u0435\u0441\u0442\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"dart\">const _executable = 'lib\/main.dart'; const _experiments = ['macros']; const _workingDirectory = 'example'; const _usageExitCode = 64;  \/\/ ...  group('int', () {   test('missing required', () async {     final arguments = {..._arguments};     arguments.remove(_requiredInt);      final result = await dartRun(       [_executable, ...arguments.values],       experiments: _experiments,       workingDirectory: _workingDirectory,       expectedExitCode: _usageExitCode,     );      expect(       result.stderr,       'Option \"$_requiredInt\" is mandatory.\\n\\n$_helpOutput',     );   } );  \/\/ ...<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u0438\u0445 \u0438\u0437\u0443\u0447\u0430\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>dartRun<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0441\u0434\u0435\u043b\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430\u00a0Dart \u0438 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442\u00a0\u043d\u0438\u0445 \u0447\u0435\u0433\u043e\u2011\u043b\u0438\u0431\u043e. \u041e\u043d\u0430 \u0432\u00a0\u043c\u043e\u0451\u043c <a href=\"https:\/\/pub.dev\/packages\/test_util\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442\u0435 test_util<\/a>.<\/p>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/h3>\n<p>\u0412\u043e\u0442 \u044d\u0442\u0438 \u0442\u0435\u0441\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435:<\/p>\n<pre><code class=\"dart\">const _compileErrorExitCode = 254;  \/\/ ...  test('error_iterable_nullable', () async {   await dartRun(     ['lib\/error_iterable_nullable.dart'],     experiments: _experiments,     workingDirectory: _workingDirectory,     expectedExitCode: _compileErrorExitCode,     expectedErrors: const [       ExpectedFileErrors('lib\/error_iterable_nullable.dart', [         ExpectedError(           'A List cannot be nullable because it is just empty '           'when no options with this name are passed.',           [7],         ),         ExpectedError(           'A Set cannot be nullable because it is just empty '           'when no options with this name are passed.',           [8],         ),       ]),     ],   ); });<\/code><\/pre>\n<p>\u0422\u0430\u00a0\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>dartRun<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435\u00a0\u0441\u0443\u043f\u0435\u0440\u2011\u043d\u0430\u0434\u0451\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0437\u0434\u0435\u0441\u044c \u043d\u0435\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0448\u0438\u043d\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f stderr \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u042d\u0442\u043e\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u00a0\u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u043b\u0438\u00a0\u0435\u0441\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e\u00a0\u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0434\u043e 10\u00a0\u043e\u0448\u0438\u0431\u043e\u043a, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043e 9\u00a0\u043e\u0448\u0438\u0431\u043e\u043a (\u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 10, \u0442\u043e \u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u043c,\u00a0\u0431\u044b\u043b\u0430\u00a0\u043b\u0438 11-\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0442\u00a0\u043d\u0430\u0441 \u0441\u043f\u0440\u044f\u0442\u0430\u043b\u0438). \u0418 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437\u00a0\u043f\u0440\u0438\u0447\u0438\u043d, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u00a0\u0442\u0435\u0441\u0442\u0430\u0445 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0430\u00a0\u043d\u0435\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447 \u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u0414\u043b\u044f\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/github.com\/dart-lang\/sdk\/issues\/56040#issuecomment-2192126684\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0442 \u0431\u0430\u0433<\/a> \u0441\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c. \u0418 \u044d\u0442\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\u00a0\u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/dart-lang\/sdk\/blob\/main\/pkg\/analysis_server\/tool\/lsp_spec\/README.md\" rel=\"noopener noreferrer nofollow\">Language Server Protocol<\/a> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u00a0\u043a\u043e\u0434\u0435, \u043d\u0435\u00a0\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 10\u00a0\u0448\u0442\u0443\u043a\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0418\u0442\u043e\u0433<\/h2>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u0434\u043e\u00a0\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e API \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0431\u0435\u0437\u00a0\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u043d\u043e\u00a0\u0434\u0430\u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0435\u0449\u0451 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430.<\/p>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u044b \u0441\u0435\u0439\u0447\u0430\u0441\u00a0\u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0442\u0440\u0435\u043d\u0430\u0436\u0451\u0440 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439.<\/p>\n<p>\u042f \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u043b\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u043b \u0432\u0441\u0451 \u044d\u0442\u043e. \u041d\u043e\u00a0\u0435\u0441\u043b\u0438\u00a0\u0431\u044b \u044f \u0437\u043d\u0430\u043b, \u0447\u0442\u043e\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f \u0443\u0439\u0434\u0451\u0442 \u043c\u0435\u0441\u044f\u0446, \u0442\u043e \u043b\u0443\u0447\u0448\u0435\u00a0\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u043b \u0447\u0442\u043e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u0431\u044b\u043b\u0438. \u041d\u0443, \u0445\u043e\u0442\u044f\u00a0\u0431\u044b \u0432\u044b \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0443\u0437\u043d\u0430\u043b\u0438, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0435\u00a0\u0437\u0440\u044f.<\/p>\n<p>\u041d\u0435\u00a0\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u043c\u043e\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u043e\u0434\u043f\u0438\u0448\u0438\u0442\u0435\u0441\u044c <a href=\"https:\/\/t.me\/ainkin_com\" rel=\"noopener noreferrer nofollow\">\u0432\u00a0\u0422elegram<\/a>\u00a0\u2014 \u044d\u0442\u043e \u043c\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b. <a href=\"https:\/\/t.me\/ainkin_com_ru\" rel=\"noopener noreferrer nofollow\">\u0412\u00a0\u043a\u0430\u043d\u0430\u043b\u0435 \u043d\u0430\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u043c<\/a>\u00a0\u2014 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b (\u0441 \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430). \u0415\u0449\u0451 <a href=\"https:\/\/x.com\/AlexeyInkin\" rel=\"noopener noreferrer nofollow\">Twitter<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/alexey-inkin\/\" rel=\"noopener noreferrer nofollow\">LinkedIn<\/a> \u0438 <a href=\"https:\/\/github.com\/alexeyinkin\" rel=\"noopener noreferrer nofollow\">GitHub<\/a>.<\/p>\n<h2>\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0435\u0439<\/h2>\n<h3>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart:<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/dart-lang\/language\/blob\/main\/working\/macros\/feature-specification.md\" rel=\"noopener noreferrer nofollow\">\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/dart-lang\/language\/blob\/main\/working\/augmentation-libraries\/feature-specification.md\" rel=\"noopener noreferrer nofollow\">\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u00a0\u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/macros\" rel=\"noopener noreferrer nofollow\">\u041f\u0430\u043a\u0435\u0442 macros<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/json\" rel=\"noopener noreferrer nofollow\">\u041f\u0430\u043a\u0435\u0442 json<\/a> \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c\u2011\u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c <code>@JsonCodable<\/code>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/dart-lang\/sdk\/tree\/main\/pkg\/_macros\/lib\/src\/api\" rel=\"noopener noreferrer nofollow\">API \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041c\u043e\u0438 \u043f\u0430\u043a\u0435\u0442\u044b:<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/args_macro\" rel=\"noopener noreferrer nofollow\">args_macro<\/a>\u00a0\u2014 \u0442\u0435\u043c\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">macro_util<\/a>\u00a0\u2014 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/show_augmentation\" rel=\"noopener noreferrer nofollow\">show_augmentation<\/a>\u00a0\u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 IDE \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/test_util\" rel=\"noopener noreferrer nofollow\">test_util<\/a>\u00a0\u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>dartRun<\/code>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/common_macros\" rel=\"noopener noreferrer nofollow\">common_macros<\/a>\u00a0\u2014 \u043c\u0430\u043a\u0440\u043e\u0441 <code>@Constructor<\/code>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pub.dev\/packages\/enum_map\" rel=\"noopener noreferrer nofollow\">enum_map<\/a>\u00a0\u2014 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u0432\u0435\u0440\u0441\u0438\u044f 0.4+, \u043f\u043e\u043a\u0430 pre\u2011release.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/831546\/\"> https:\/\/habr.com\/ru\/articles\/831546\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043c\u0435\u0441\u044f\u0446 \u0444\u0443\u043b\u2011\u0442\u0430\u0439\u043c\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438. \u0418 \u0432\u043e\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/821911\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0431\u0435\u0442\u0430\u2011\u0432\u0435\u0440\u0441\u0438\u044e Dart \u0434\u043b\u044f\u00a0\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438, \u0438\u0441\u043f\u044b\u0442\u0430\u043b\u0438 \u043c\u0430\u043a\u0440\u043e\u0441 <code>@JsonCodable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Dart \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u0434\u043b\u044f\u00a0\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 hello\u2011world \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<p>\u0412\u00a0\u044d\u0442\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 <a href=\"https:\/\/pub.dev\/packages\/args_macro\" rel=\"noopener noreferrer nofollow\">\u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u043d\u0430\u00a0\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0443\u0437\u043d\u0430\u043b \u043f\u0440\u043e\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u0438\u0437\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><strong>\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e:<\/strong> \u041c\u0430\u043a\u0440\u043e\u0441\u044b \u0432\u00a0Dart \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438. \u041f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u0435\u00a0\u0431\u044b\u043b\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<h2>\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u0442\u0435<\/h2>\n<p>\u0421\u00a0\u043b\u044e\u0431\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0438 \u0443\u0436\u0435 \u0433\u043b\u044f\u0434\u044f \u043d\u0430\u00a0\u043d\u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440.<\/p>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u043a\u00a0\u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   final int count; }<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"dart\">class HelloArgsParser {   final parser = ArgParser();    HelloArgsParser() {     _addOptions();   }    void _addOptions() {     parser.addOption(\"name\", mandatory: true);     parser.addOption(\"count\", mandatory: true);   }    HelloArgs parse(List&lt;String&gt; argv) {     final wrapped = parser.parse(argv);      return HelloArgs(       name: wrapped.option(\"name\")!,       count: int.parse(wrapped.option(\"count\")!),     );   } }  augment class HelloArgs {   HelloArgs({     required this.name,     required this.count,   }); }<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/alexeyinkin\/dart-args-macro\/tree\/tutorial_step_1_min\" rel=\"noopener noreferrer nofollow\">\u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/a> \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e (\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0432\u0435\u0442\u043a\u0430 \u043f\u043e\u00a0\u0441\u0441\u044b\u043b\u043a\u0435). \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0435\u0433\u043e, \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0439\u0434\u0451\u043c \u0432\u00a0\u0434\u0435\u0431\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432, \u0441\u043f\u0438\u0441\u043a\u043e\u0432, enum, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438\u00a0\u0442.\u00a0\u043f. \u041d\u043e\u00a0\u043d\u0430\u0447\u043d\u0451\u043c \u0441\u00a0\u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<h2>\u0424\u0430\u0437\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432<\/h2>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441 \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u044e \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u00a0\u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u0432\u0435\u0434\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u00a0\u0443\u00a0\u043d\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u043a\u043b\u0430\u0441\u0441. \u041c\u043e\u0433\u0443\u0442\u00a0\u043b\u0438 \u043e\u043d\u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u043e\u043c? \u0412\u00a0\u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435? \u0427\u0442\u043e\u0431\u044b \u0432\u00a0\u044d\u0442\u043e\u043c\u00a0\u0431\u044b\u043b \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0440\u0438 \u0444\u0430\u0437\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432, \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0438.<\/p>\n<h3>\u0424\u0430\u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432<\/h3>\n<p>\u042d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0444\u0430\u0437\u0430. \u0412\u00a0\u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b: \u043a\u043b\u0430\u0441\u0441\u044b, mixin, enum, typedef \u0438\u00a0\u0442.\u00a0\u043f. \u041c\u0430\u043a\u0440\u043e\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043d\u0438\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043b\u044e\u0431\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0442.<\/p>\n<h3>\u0424\u0430\u0437\u0430 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439<\/h3>\n<p>\u041a\u00a0\u043d\u0430\u0447\u0430\u043b\u0443 \u0444\u0430\u0437\u044b \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439 \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0438 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0447\u043b\u0435\u043d\u044b \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u0412\u00a0\u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u00a0\u043b\u044e\u0431\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445. \u041d\u043e\u00a0\u043a\u043e\u0435\u2011\u0447\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043d\u0435\u044f\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0412\u00a0\u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"dart\">final a = b;<\/code><\/pre>\n<p><code>b<\/code> \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u043c \u0441\u00a0\u0442\u0435\u043c\u00a0\u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a\u043e\u0439\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<h3>\u0424\u0430\u0437\u0430 \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0439<\/h3>\n<p>\u041a\u00a0\u043d\u0430\u0447\u0430\u043b\u0443 \u0444\u0430\u0437\u044b \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0439 \u0432\u0441\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b, \u0438 \u0443\u0436\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0436\u0435 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043d\u0438 \u0443\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0442\u00a0\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u00a0\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043a\u00a0\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u00a0\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u042d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u043a\u043e\u0434 \u0438 \u043d\u0435\u00a0\u0437\u043d\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u043e\u00a0\u0434\u0440\u0443\u0433\u0435, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0430\u0436\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<p>\u041c\u044b \u0441\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u0435\u043c, \u0432\u00a0\u043a\u0430\u043a\u0438\u0445 \u0444\u0430\u0437\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0448 \u043c\u0430\u043a\u0440\u043e\u0441. \u042d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c.<\/p>\n<h2>\u0412\u044b\u0431\u043e\u0440 \u0444\u0430\u0437 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/h2>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u00a0\u0442\u0430\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435:<\/p>\n<pre><code class=\"dart\">@Args() class HelloArgs {   final String name;   final int count; }<\/code><\/pre>\n<p>\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>HelloArgsParser<\/code> \u0441\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c <code>ArgParser<\/code>\u00a0\u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438\u0437 <a href=\"https:\/\/pub.dev\/packages\/args\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442\u0430 args<\/a>, \u0438 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u0432\u0435 \u0444\u0430\u0437\u044b \u0438\u0437\u00a0\u0442\u0440\u0451\u0445:<\/p>\n<ul>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>HelloArgsParser<\/code>, \u0442\u043e\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u0430 \u0444\u0430\u0437\u0430 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u044f, \u043d\u0443\u0436\u043d\u0430 \u0444\u0430\u0437\u0430 \u0438\u043b\u0438\u00a0\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439, \u0438\u043b\u0438\u00a0\u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0439. \u0421\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0444\u0430\u0437\u043e\u0439 \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0444\u0430\u0437\u0443 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:<\/p>\n<pre><code class=\"dart\">macro class Args implements ClassTypesMacro, ClassDeclarationsMacro {   @override   Future&lt;void&gt; buildTypesForClass(     ClassDeclaration clazz,     ClassTypeBuilder builder,   ) async {     \/\/ \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043b\u0430\u0441\u0441.   }      @override   Future&lt;void&gt; buildDeclarationsForClass(     ClassDeclaration clazz,     MemberDeclarationBuilder builder,   ) async {     \/\/ \u0410 \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u043f\u0430\u0440\u0441\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.   } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0444\u0430\u0437\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>ClassDefinitionsMacro<\/code>, \u043d\u0430\u043c \u043e\u043d \u043d\u0435\u00a0\u043d\u0443\u0436\u0435\u043d.<\/p>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043a\u00a0\u0434\u0440\u0443\u0433\u0438\u043c \u0432\u0435\u0449\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0440\u043e\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u00a0enum, \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>EnumTypesMacro<\/code>, <code>EnumDeclarationsMacro<\/code> \u0438\u043b\u0438 <code>EnumDefinitionsMacro<\/code>. \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043e\u043d\u0438 <a href=\"https:\/\/github.com\/dart-lang\/sdk\/blob\/main\/pkg\/_macros\/lib\/src\/api.dart\" rel=\"noopener noreferrer nofollow\">\u0432\u00a0API<\/a>.<\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<ol>\n<li>\n<p>\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d \u0432\u044b\u0437\u0432\u0430\u043d.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u043b\u0434\u0435\u0440, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0434\u043b\u044f\u00a0\u0444\u0430\u0437\u044b. \u0422\u0438\u043f \u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u043a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043c\u0430\u043a\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0430\u0437\u0435.<\/p>\n<\/li>\n<\/ol>\n<h2>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/h2>\n<p>\u042d\u0442\u043e \u043b\u0435\u0433\u043a\u043e:<\/p>\n<pre><code class=\"dart\">@override Future&lt;void&gt; buildTypesForClass(   ClassDeclaration clazz,   ClassTypeBuilder builder, ) async {   final name = clazz.identifier.name;   final parserName = _getParserName(clazz);    builder.declareType(     name,     DeclarationCode.fromString('class $parserName {}\\n'),   ); }  String _getParserName(ClassDeclaration clazz) {   final name = clazz.identifier.name;   return '${name}Parser'; }<\/code><\/pre>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u0443\u0441\u0442\u044b\u043c. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0447\u043b\u0435\u043d\u0430\u043c\u0438, \u043d\u043e\u00a0\u043d\u0430\u043c \u043f\u043e\u0447\u0442\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u00a0\u043f\u043e\u043b\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0430\u0437\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u00a0\u0440\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0441\u0440\u0430\u0437\u0443 \u0432\u00a0\u0444\u0430\u0437\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439.<\/p>\n<h2>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/h2>\n<p>\u0412\u00a0\u0444\u0430\u0437\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<ol>\n<li>\n<p>\u0423\u0437\u043d\u0430\u0442\u044c \u0432\u0441\u0451 \u043e\u00a0\u043f\u043e\u043b\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u0430\u0440\u0441\u0438\u043b, \u0430\u00a0\u043d\u0435\u00a0\u0431\u044b\u043b \u043f\u0443\u0441\u0442\u044b\u043c.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"dart\">@override Future&lt;void&gt; buildDeclarationsForClass(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   final intr = await _introspect(clazz, builder);    await _declareConstructor(clazz, builder);   _augmentParser(builder, intr); }<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e\u00a0\u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438 \u0432\u0441\u0451 \u043e\u00a0\u043f\u043e\u043b\u044f\u0445 \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u044d\u0442\u043e \u0432\u00a0\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>intr<\/code>, \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u043b\u0430.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430<\/h2>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0441\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043d\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0433\u043e.<\/p>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/common_macros\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441 <\/a><code>@Constructor()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 \u0431\u0435\u0440\u0451\u0442 \u043d\u0430\u00a0\u0441\u0435\u0431\u044f \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043b\u043e\u0447\u0435\u0439 \u0438 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0435 <code>Args<\/code> \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\u00a0\u043b\u0438\u0448\u044c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<pre><code class=\"dart\">Future&lt;void&gt; _declareConstructor(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   await const Constructor().buildDeclarationsForClass(clazz, builder); }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043e\u0434\u0438\u043d \u043c\u0430\u043a\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439. \u041c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u043e\u0442\u00a0\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0431\u0438\u043b\u0434\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u043d\u0438\u0447\u0435\u043c \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0430\u043c\u0438.<\/p>\n<h2>\u041f\u0440\u043e\u0445\u043e\u0434\u044b \u043f\u043e \u043f\u043e\u043b\u044f\u043c<\/h2>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044f\u043c \u0434\u0432\u0430 \u0440\u0430\u0437\u0430:<\/p>\n<ol>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u044e \u0432 <code>ArgParser<\/code> \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u00a0\u043f\u0430\u0440\u0441\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u043a\u0430\u0436\u0434\u044b\u043c \u043f\u043e\u043b\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0435\u0433\u043e \u0442\u0438\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/visitor\" rel=\"noopener noreferrer nofollow\">\u0448\u0430\u0431\u043b\u043e\u043d Visitor<\/a>, \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e\u00a0\u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"dart\">abstract class ArgumentVisitor&lt;R&gt; {   R visitInt(IntArgument argument);   R visitString(StringArgument argument); }<\/code><\/pre>\n<p>\u0418 \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"dart\">sealed class Argument {   Argument({     required this.intr,     required this.optionName,   });    final FieldIntrospectionData intr;   final String optionName;    R accept&lt;R&gt;(ArgumentVisitor&lt;R&gt; visitor); }  class IntArgument extends Argument {   IntArgument({     required super.intr,     required super.optionName,   });    @override  R accept&lt;R&gt;(ArgumentVisitor&lt;R&gt; visitor) {     return visitor.visitInt(this);   } }  \/\/ \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f StringArgument.<\/code><\/pre>\n<h2>\u0418\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f<\/h2>\n<h3>\u041a\u043b\u0430\u0441\u0441 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438<\/h3>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438: \u043e\u00a0\u043f\u043e\u043b\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043e\u0431\u00a0\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u0445 \u0434\u043b\u044f\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0445 \u0432\u00a0\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438\u00a0\u0442.\u00a0\u043f.<\/p>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u0430\u00a0\u043d\u0435\u00a0\u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041d\u0430\u0437\u043e\u0432\u0451\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 <code>IntrospectionData<\/code>:<\/p>\n<pre><code class=\"dart\">Future&lt;IntrospectionData&gt; _introspect(   ClassDeclaration clazz,   MemberDeclarationBuilder builder, ) async {   final fields = await builder.introspectFields(clazz);   final ids = await ResolvedIdentifiers.resolve(builder);   final arguments = await _fieldsToArguments(fields, builder);    return IntrospectionData(     arguments: arguments,     clazz: clazz,     fields: fields,     ids: ids,   ); }<\/code><\/pre>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u00a0\u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043e\u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f, \u0447\u0442\u043e\u00a0\u044f \u0432\u044b\u043d\u0435\u0441 \u0435\u0451 \u0432\u00a0\u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/pub.dev\/packages\/macro_util\" rel=\"noopener noreferrer nofollow\">macro_util<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Map \u0438\u0437\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u00a0\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043d\u0438\u0445:<\/p>\n<pre><code class=\"dart\">final fields = await builder.introspectFields(clazz);<\/code><\/pre>\n<p>\u042d\u0442\u043e extension\u2011\u043c\u0435\u0442\u043e\u0434. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a\u00a0\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u044d\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c <code>ClassDeclaration<\/code>, \u0442\u043e \u0432\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"dart\">final List&lt;FieldDeclaration&gt; fields = await builder.fieldsOf(type);  for (final field in fields) {   \/\/ \u0414\u0435\u043b\u0430\u0435\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c. }<\/code><\/pre>\n<h3>FieldDeclaration<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u00a0\u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u00a0\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0438\u0441\u043a\u0430. \u042d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u0432\u0438\u0434\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0438\u0437\u00a0\u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044f. \u0412\u00a0\u044d\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>hasConst<\/code>, <code>hasFinal<\/code>, <code>hasStatic<\/code>, <code>hasInitializer<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0434\u043b\u044f\u00a0\u043d\u0430\u0441\u00a0\u2014 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>type<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>TypeAnnotation<\/code>.<\/p>\n<h3>TypeAnnotation<\/h3>\n<p>\u042d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043e\u00a0\u0442\u0438\u043f\u0435 \u043f\u043e\u043b\u044f \u0431\u0435\u0437\u00a0\u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u041e\u043d \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439, \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043f\u043e\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f:<br \/><code>Foo foo;<\/code><br \/>\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>NamedTypeAnnotation<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>Foo<\/code>,<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-427450","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/427450","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=427450"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/427450\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=427450"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=427450"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=427450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}