Существует ли простой способ сравнения обобщенных типов c stati c Dart (DartType)? - PullRequest
1 голос
/ 07 января 2020

Использование 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 [];
  }


}
...
...