我创建了一个像这样的元数据注释:
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 在我的原始代码中执行类似的操作?
尽管宏还不是 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 中的自定义规则无法实现您想要的效果,您可能需要分叉分析器并在分析器的分叉中创建您自己的诊断消息。
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |