使用 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>.
类型的元素
是否有比较(通用)静态 DartType 的直接方法? 类似的东西:
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 [];
}
}
...
最佳答案
isDartCoreInt
呢?
即:
bool isRaw(element) => element.type.isDartCoreInt ||
element.type.isDartCoreBool
关于dart - 是否有比较通用静态 Dart 类型 (DartType) 的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619164/