【问题标题】:Is there a simple way of comparing generic static Dart types (DartType)?有没有比较通用静态 Dart 类型(DartType)的简单方法?
【发布时间】: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&lt;int&gt;, Property&lt;bool&gt;, Property&lt;String&gt;. 类型的元素

有比较(通用)静态 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


    【解决方案1】:

    isDartCoreInt 呢?

    即:

    bool isRaw(element) => element.type.isDartCoreInt || 
      element.type.isDartCoreBool
    

    【讨论】:

    • 嗨,澄清一下,问题是关于泛型类型的。在我上面提到的示例中,对象的运行时间是Property&lt;int&gt;Property&lt;String&gt;。换句话说,泛型类型是PropertyStringint 是类型参数。
    • 是的,我明白了。无论它是否是泛型类型,最终它都是 DartType,因此,您可以使用 isDartCoreInt,在您的情况下:propertyType.isDartCoreInt 而不是 _argumentChecker.isExactlyType(propertyType)。我所做的是一个 isCore 扩展方法,它调用所有那些 isDartCore 东西
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多