Search code examples
dartdart-mirrors

Refer classes by their metadata tag


Is it possible to find(probably with the mirror API) all classes(in my project) with some metadata annotation?

Example:

import 'baz.dart'; //more tagged classes

@Tag(#foo)
class A{

}
@Tag(#foo)
class B{

}

void main() {
 List<ClassMirror> li = getClassMirrorsByTag(#foo);
}

Solution

  • I have found the answer:

    getClassMirrorsByTag.dart

    library impl;
    @MirrorsUsed(metaTargets: Tag)
    import 'dart:mirrors';
    
    class Tag {
      final Symbol name;
      const Tag(this.name);
    }
    List<ClassMirror> getClassMirrorsByTag(Symbol name) {
      List<ClassMirror> res = new List<ClassMirror>();
      MirrorSystem ms = currentMirrorSystem();
      ms.libraries.forEach((u, lm) {
        lm.declarations.forEach((s, dm) {
          dm.metadata.forEach((im) {
            if ((im.reflectee is Tag) && im.reflectee.name == name) {
              res.add(dm);
            }
          });
        });
      });
      return res;
    }
    

    extra.dart

    library extra;
    import 'getClassMirrorsByTag.dart';
    
    @Tag(#foo)
    class C {}
    

    main.dart

    library  main;
    import 'getClassMirrorsByTag.dart';
    import 'extra.dart';
    @Tag(#foo)
    class A{}
    @Tag(#baz)
    class B{}
    
    
    void main() {
      print(getClassMirrorsByTag(#foo));
    }
    

    output:

    [ClassMirror on 'A', ClassMirror on 'C']