【发布时间】:2020-04-24 09:55:44
【问题描述】:
使用 SimpleElementVisitor(来自 Dart 包 source_gen)我正在尝试处理输入文件说 player_input.dart:
class _PlayerInput {
final id = Property<int>();
final name = Property<String>();
final int teamId;
}
生成一个模型说 player.dart:
class Player {
final int id;
final String name;
const Player({this.id, this.name});
}
在遍历_PlayerInput 的字段时,我想过滤掉Property<int>, Property<bool>, Property<String>. 类型的元素
有比较(通用)静态 DartTypes 的直接方法吗? 大致如下:
if (element.type == (A static type corresponding to Property<int> || ... ){
properties.add(element);
}
目前,我以一种相当复杂的方式使用TypeChecker。请参阅下面的方法_addProperty()。
class _PlayerVisitor extends SimpleElementVisitor {
List<FieldElement> fields = [];
List<FieldElement> properties = [];
static var _propertyChecker = TypeChecker.fromRuntime(Property);
static var _argumentChecker = TypeChecker.any([
TypeChecker.fromRuntime(int),
TypeChecker.fromRuntime(bool),
TypeChecker.fromRuntime(String),
]);
_addProperty(FieldElement element) {
// Check if element is [Property<Type>].
if (!_propertyChecker.isAssignableFromType(element.type)) return;
// Validate type argument of Property<Type>
var propertyType = typeArgumentsOf(element.type).first;
if (_argumentChecker.isExactlyType(propertyType)) {
properties.add(element);
} else {
// Invalid type argument of generic class Property<Type>.
throw ModelGeneratorException(
'''Variable ${element.name} has unsupported type: Property<$propertyType>.
Valid types are: Property<int>, Property<String>, Property<bool>''');
}
}
@override
visitFieldElement(FieldElement element) {
fields.add(element);
_addProperty(element);
}
List<DartType> typeArgumentsOf(DartType type) {
return type is ParameterizedType ? type.typeArguments : const [];
}
}
...
【问题讨论】:
标签: dart types code-generation analyzer visitor-pattern