如何使用元数据注释在 Dart 分析器中提供警告消息?

iDe*_*ode 8 dart flutter

我创建了一个像这样的元数据注释:

class UseInt {
  const UseInt();
}

@UseInt()
class Foo {
  // Should give a lint warning saying "The class should only use ints".
  String message = ''; 
}
Run Code Online (Sandbox Code Playgroud)

正如您可能已经看到的,当您尝试做一些违背最初意图的事情时,内置的 Dart 和 Flutter 元数据会向您发出警告消息,如下所示:

在此输入图像描述

如何让 IDE 在我的原始代码中执行类似的操作?

Gre*_*rad 2

编辑2(宏)

尽管宏还不是 Dart 规范的一部分(并且实际上是用于代码生成),但您实际上可以在此处使用它们进行类型检查(并且可以用于防止编译!)。在您的示例中,UseInt将是类上的第 3 阶段宏:

macro class UseInt implements ClassDefinitionsMacro {
  const UseInt();

  @override
  Future<void> buildDefinitionForClass(
      ClassDeclaration clazz, ClassDefinitionBuilder builder) async {
    final fields = await builder.fieldsOf(class);

    for (final field in fields) {
       final type = await builder.resolve(field.type.code);
       final isInt = false; // TODO probably could be done with something like type.isSubtypeOf but I haven't figured out the best way to do this yet
       assert(isInt, '$field in $clazz is not of type int!');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关宏的更多信息:https ://github.com/dart-lang/language/blob/master/working/macros/feature-specification.md

编辑(插件)

我忘记了你实际上可以创建一个分析器/linter 插件。请参阅此处:https://github.com/rrousselGit/riverpod/tree/master/packages/riverpod_lint

和这里:

https://pub.dev/packages/custom_lint

原答案

这非常重要。

我稍微挖掘了几个不同包的源代码,看起来您可能能够创建linter的分支并为UseInt. 有很多例子;例如,您可以在此处avoid_print查看如何定义。

但是,您提供的屏幕截图实际上must_be_immutable在分析器本身中定义的。如果 linter 中的自定义规则无法实现您想要的效果,您可能需要分叉分析器在分析器的分叉中创建您自己的诊断消息。