Как отразить `конструктор перенаправления` в Dart? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь создать библиотеку JSON-сериализации на основе отражения (от dart: mirrors), но я не могу найти способ отразить redirecting constructor.

Напримерздесь класс T с redirecting constructor, я пробую множество способов отразить конструктор T(String), например, найти его в полях cls.staticMembers и cls.declarations, но я не могу его получить.

class T {
  final String test;
  const T._(this.test);
  const factory T(String test) = T._;
}

Пробовал:

  var cls = reflectClass(T);
  cls.declarations.entries.forEach(print);
  cls.staticMembers.entries.forEach(print);

Результат:

MapEntry(Symbol("test"): VariableMirror on 'test')
MapEntry(Symbol("_redirecting#"): VariableMirror on '_redirecting#')
MapEntry(Symbol("T._"): MethodMirror on 'T._')
MapEntry(Symbol("_redirecting#"): Instance of '_SyntheticAccessor')
MapEntry(Symbol("_redirecting#="): Instance of '_SyntheticAccessor')

Кстати, ни у VariableMirror on '_redirecting#', ни у Instance of '_SyntheticAccessor' нет нужных мне полей.

Наиболее распространенным примером является встроенный тип Symbol, он имеет redirecting constructor, например:

abstract class Symbol {
  ...
  const factory Symbol(String name) = internal.Symbol;
  ...
}


Более того, для класса Symbol я должендаже не нашел ничего подобного Symbol("_redirecting#").Попробовал:

  var cls = reflectClass(Symbol);
  cls.declarations.entries.forEach(print);
  cls.staticMembers.entries.forEach(print);

Только найдено:

MapEntry(Symbol("unaryMinus"): VariableMirror on 'unaryMinus')
MapEntry(Symbol("empty"): VariableMirror on 'empty')
MapEntry(Symbol("hashCode"): MethodMirror on 'hashCode')
MapEntry(Symbol("=="): MethodMirror on '==')
MapEntry(Symbol("unaryMinus"): Instance of '_SyntheticAccessor')
MapEntry(Symbol("empty"): Instance of '_SyntheticAccessor')

...