Использование 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>.
Есть ли простой способ сравнения (generi c) stati c 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 [];
}
}
...