From bcee87949a4e0e92762383adcd0c74a24919f564 Mon Sep 17 00:00:00 2001 From: Tobe O Date: Tue, 21 Aug 2018 09:36:52 -0400 Subject: [PATCH] Add `getField` to `ReflectedInstance`. --- angel_container/CHANGELOG.md | 3 ++ .../lib/src/mirrors/reflector.dart | 14 +++++++- angel_container/lib/src/reflector.dart | 2 ++ angel_container/pubspec.yaml | 2 +- angel_container/test/common.dart | 34 +++++++++++++++++++ 5 files changed, 53 insertions(+), 2 deletions(-) diff --git a/angel_container/CHANGELOG.md b/angel_container/CHANGELOG.md index 43ba4b97..8903d8dc 100644 --- a/angel_container/CHANGELOG.md +++ b/angel_container/CHANGELOG.md @@ -1,3 +1,6 @@ +# 1.0.0-alpha.6 +* Add `getField` to `ReflectedInstance`. + # 1.0.0-alpha.5 * Remove concrete type from `ReflectedTypeParameter`. diff --git a/angel_container/lib/src/mirrors/reflector.dart b/angel_container/lib/src/mirrors/reflector.dart index 7a6d541f..634f3e62 100644 --- a/angel_container/lib/src/mirrors/reflector.dart +++ b/angel_container/lib/src/mirrors/reflector.dart @@ -46,7 +46,7 @@ class MirrorsReflector implements Reflector { @override ReflectedInstance reflectInstance(Object object) { - return new _ReflectedInstanceMirror(object); + return new _ReflectedInstanceMirror(dart.reflect(object)); } } @@ -145,6 +145,13 @@ class _ReflectedClassMirror extends ReflectedClass { .newInstance(new Symbol(constructorName), positionalArguments) .reflectee as T; } + + @override + bool operator ==(other) { + return other is _ReflectedClassMirror && other.mirror == mirror; + } + + } class _ReflectedDeclarationMirror extends ReflectedDeclaration { @@ -172,6 +179,11 @@ class _ReflectedInstanceMirror extends ReflectedInstance { T invoke(Invocation invocation) { return mirror.delegate(invocation) as T; } + + @override + T getField(String name) { + return mirror.getField(new Symbol(name)).reflectee as T; + } } class _ReflectedMethodMirror extends ReflectedFunction { diff --git a/angel_container/lib/src/reflector.dart b/angel_container/lib/src/reflector.dart index 224b2b35..adefac79 100644 --- a/angel_container/lib/src/reflector.dart +++ b/angel_container/lib/src/reflector.dart @@ -28,6 +28,8 @@ abstract class ReflectedInstance { other is ReflectedInstance && other.type == type && other.clazz == clazz; T invoke(Invocation invocation); + + T getField(String name); } abstract class ReflectedType { diff --git a/angel_container/pubspec.yaml b/angel_container/pubspec.yaml index 9fc0a5c1..05554bac 100644 --- a/angel_container/pubspec.yaml +++ b/angel_container/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_container -version: 1.0.0-alpha.5 +version: 1.0.0-alpha.6 author: Tobe O description: "A better IoC container and dependency injector for Angel, ultimately allowing Angel to be used without dart:mirrors." homepage: https://github.com/angel-dart/container.git diff --git a/angel_container/test/common.dart b/angel_container/test/common.dart index d27969d5..c11feeed 100644 --- a/angel_container/test/common.dart +++ b/angel_container/test/common.dart @@ -1,6 +1,10 @@ import 'package:angel_container/angel_container.dart'; import 'package:test/test.dart'; +void returnVoidFromAFunction(int x) { + +} + void testReflector(Reflector reflector) { var blaziken = new Pokemon('Blaziken', PokemonType.fire); Container container; @@ -10,6 +14,36 @@ void testReflector(Reflector reflector) { container.registerSingleton(blaziken); }); + test('get field', () { + var blazikenMirror = reflector.reflectInstance(blaziken); + expect(blazikenMirror.getField('type'), blaziken.type); + }); + + group('reflectFunction', () { + var mirror = reflector.reflectFunction(returnVoidFromAFunction); + + test('void return type returns dynamic', () { + expect(mirror.returnType, reflector.reflectType(dynamic)); + }); + + test('counts parameters', () { + expect(mirror.parameters, hasLength(1)); + }); + + test('counts types parameters', () { + expect(mirror.typeParameters, isEmpty); + }); + + test('correctly reflects parameter types', () { + var p = mirror.parameters[0]; + expect(p.name, 'x'); + expect(p.isRequired, true); + expect(p.isNamed, false); + expect(p.annotations, isEmpty); + expect(p.type, reflector.reflectType(int)); + }); + }); + test('make on singleton type returns singleton', () { expect(container.make(Pokemon), blaziken); });