如何为字段中的注释生成Dart代码?

马塞尔

我正在使用编写Dart的代码生成器build_runner,但并未为字段中的注释调用构建器,尽管它确实适用于类中的注释。

是否可以在字段(或与此相关的任何位置)处调用生成器进行注释?

例如,将为以下文件调用构建器:

import 'package:my_annotation/my_annotation.dart';

part 'example.g.dart';

@MyAnnotation()
class Fruit {
  int number;
}

但不是这个:

import 'package:my_annotation/my_annotation.dart';

part 'example.g.dart';

class Fruit {
  @MyAnnotation()
  int number;
}

这是注释的定义:

class MyAnnotation {
  const MyAnnotation();
}

这就是生成器的定义方式。现在,只要调用它,它就会中止,从而导致显示错误消息。

library my_annotation_generator;

import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:my_annotation/my_annotation.dart';
import 'package:source_gen/source_gen.dart';

Builder generateAnnotation(BuilderOptions options) =>
    SharedPartBuilder([MyAnnotationGenerator()], 'my_annotation');

class MyAnnotationGenerator extends GeneratorForAnnotation<MyAnnotation> {
  @override
  generateForAnnotatedElement(Element element, ConstantReader annotation, _) {
    throw CodeGenError('Generating code for annotation is not implemented yet.');
}

这里的build.yaml配置:

targets:
  $default:
    builders:
      my_annotation_generator|my_annotation:
        enabled: true

builders:
  my_annotation:
    target: ":my_annotation_generator"
    import: "package:my_annotation/my_annotation.dart"
    builder_factories: ["generateAnnotation"]
    build_extensions: { ".dart": [".my_annotation.g.part"] }
    auto_apply: dependents
    build_to: cache
    applies_builders: ["source_gen|combining_builder"]
马塞尔

内建方法GeneratorForAnnotation使用LibraryElementannotatedWith(...)方法,该方法仅检查顶级注释。要还检测字段上的注释,您需要编写一些自定义内容。

这是Generator我为我的项目写的:

abstract class GeneratorForAnnotatedField<AnnotationType> extends Generator {
  /// Returns the annotation of type [AnnotationType] of the given [element],
  /// or [null] if it doesn't have any.
  DartObject getAnnotation(Element element) {
    final annotations =
        TypeChecker.fromRuntime(AnnotationType).annotationsOf(element);
    if (annotations.isEmpty) {
      return null;
    }
    if (annotations.length > 1) {
      throw Exception(
          "You tried to add multiple @$AnnotationType() annotations to the "
          "same element (${element.name}), but that's not possible.");
    }
    return annotations.single;
  }

  @override
  String generate(LibraryReader library, BuildStep buildStep) {
    final values = <String>{};

    for (final element in library.allElements) {
      if (element is ClassElement && !element.isEnum) {
        for (final field in element.fields) {
          final annotation = getAnnotation(field);
          if (annotation != null) {
            values.add(generateForAnnotatedField(
              field,
              ConstantReader(annotation),
            ));
          }
        }
      }
    }

    return values.join('\n\n');
  }

  String generateForAnnotatedField(
      FieldElement field, ConstantReader annotation);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编译器如何为虚拟函数调用生成代码?

来自分类Dev

如何为带有特定注释的字段设置FindBugs过滤器?

来自分类Dev

如何为Dart中的滚动动画?

来自分类Dev

如何为动态生成的字段创建规则

来自分类Dev

如何在Windows应用商店应用中为自动生成的代码禁用“缺少XML注释”警告?

来自分类Dev

如何在Java的带注释字段中设置值?

来自分类Dev

如何为pydoc注释参数

来自分类Dev

如何在Kotlin中列出字段注释?

来自分类Dev

如何为Javadoc注释上色

来自分类Dev

如何从代码中删除C样式的注释

来自分类Dev

如何为一个类中的两个服务分别生成WCF代理代码?

来自分类Dev

如何生成代码以导出Dart中节点的功能?

来自分类Dev

您如何在Django中取消带注释的字段?

来自分类Dev

如何为Doctrine生成的代码设置换行符?

来自分类Dev

如何在Emacs中的注释中设置代码缩进?

来自分类Dev

如何在Rhapsody代码生成中避免特殊注释?

来自分类Dev

如何生成代码以导出Dart中节点的功能?

来自分类Dev

如何使用注释在DjangoORM中创建通知日期字段

来自分类Dev

Xtend:在代码生成过程中删除活动注释

来自分类Dev

如何在Parcelable中包含以@StringDef注释的字段?

来自分类Dev

如何为按钮生成嵌入代码

来自分类Dev

如何读取类中字段上的运行时注释

来自分类Dev

如何为表格中的字段设置边框?

来自分类Dev

如何为动态生成的表单字段实现表单验证

来自分类Dev

Jhipster:如何为实体/复数实体列表生成代码

来自分类Dev

我如何为 woocommerce 结账生成安全代码/密钥?

来自分类Dev

如何通过休眠注释映射模型类中的布尔字段

来自分类Dev

如何在 Kotlin 生成的 Java 代码中禁用 @NonNull/@Nullable 注释

来自分类Dev

如何访问 Dart 中的地图字段

Related 相关文章

  1. 1

    编译器如何为虚拟函数调用生成代码?

  2. 2

    如何为带有特定注释的字段设置FindBugs过滤器?

  3. 3

    如何为Dart中的滚动动画?

  4. 4

    如何为动态生成的字段创建规则

  5. 5

    如何在Windows应用商店应用中为自动生成的代码禁用“缺少XML注释”警告?

  6. 6

    如何在Java的带注释字段中设置值?

  7. 7

    如何为pydoc注释参数

  8. 8

    如何在Kotlin中列出字段注释?

  9. 9

    如何为Javadoc注释上色

  10. 10

    如何从代码中删除C样式的注释

  11. 11

    如何为一个类中的两个服务分别生成WCF代理代码?

  12. 12

    如何生成代码以导出Dart中节点的功能?

  13. 13

    您如何在Django中取消带注释的字段?

  14. 14

    如何为Doctrine生成的代码设置换行符?

  15. 15

    如何在Emacs中的注释中设置代码缩进?

  16. 16

    如何在Rhapsody代码生成中避免特殊注释?

  17. 17

    如何生成代码以导出Dart中节点的功能?

  18. 18

    如何使用注释在DjangoORM中创建通知日期字段

  19. 19

    Xtend:在代码生成过程中删除活动注释

  20. 20

    如何在Parcelable中包含以@StringDef注释的字段?

  21. 21

    如何为按钮生成嵌入代码

  22. 22

    如何读取类中字段上的运行时注释

  23. 23

    如何为表格中的字段设置边框?

  24. 24

    如何为动态生成的表单字段实现表单验证

  25. 25

    Jhipster:如何为实体/复数实体列表生成代码

  26. 26

    我如何为 woocommerce 结账生成安全代码/密钥?

  27. 27

    如何通过休眠注释映射模型类中的布尔字段

  28. 28

    如何在 Kotlin 生成的 Java 代码中禁用 @NonNull/@Nullable 注释

  29. 29

    如何访问 Dart 中的地图字段

热门标签

归档