From 62b1a08f06fb0f395296722220fd76c1c38697a0 Mon Sep 17 00:00:00 2001 From: vsavkin Date: Tue, 19 May 2015 14:29:10 -0700 Subject: [PATCH] refactor(reflection): improved error message --- .../reflection/reflection_capabilities.dart | 3 ++- .../src/reflection/reflection_capabilities.ts | 5 ++-- .../compiler/reflection_capabilities_spec.js | 23 +++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/modules/angular2/src/reflection/reflection_capabilities.dart b/modules/angular2/src/reflection/reflection_capabilities.dart index 85cba43491..2583aa45cf 100644 --- a/modules/angular2/src/reflection/reflection_capabilities.dart +++ b/modules/angular2/src/reflection/reflection_capabilities.dart @@ -1,6 +1,7 @@ library reflection.reflection_capabilities; import 'reflection.dart'; +import 'package:angular2/src/facade/lang.dart'; import 'types.dart'; import 'dart:mirrors'; @@ -45,7 +46,7 @@ class ReflectionCapabilities { create(name, [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]).reflectee; } - throw "Factory cannot take more than 10 arguments"; + throw "Cannot create a factory for '${stringify(type)}' because its constructor has more than 10 arguments"; } List parameters(typeOrFunc) { diff --git a/modules/angular2/src/reflection/reflection_capabilities.ts b/modules/angular2/src/reflection/reflection_capabilities.ts index 722e1acba7..70f082e166 100644 --- a/modules/angular2/src/reflection/reflection_capabilities.ts +++ b/modules/angular2/src/reflection/reflection_capabilities.ts @@ -1,4 +1,4 @@ -import {Type, isPresent, global} from 'angular2/src/facade/lang'; +import {Type, isPresent, global, stringify} from 'angular2/src/facade/lang'; import {List, ListWrapper} from 'angular2/src/facade/collection'; import {GetterFn, SetterFn, MethodFn} from './types'; @@ -39,7 +39,8 @@ export class ReflectionCapabilities { }; }; - throw new Error("Factory cannot take more than 10 arguments"); + throw new Error( + `Cannot create a factory for '${stringify(t)}' because its constructor has more than 10 arguments`); } _zipTypesAndAnnotaions(paramTypes, paramAnnotations): List> { diff --git a/modules/angular2/test/core/compiler/reflection_capabilities_spec.js b/modules/angular2/test/core/compiler/reflection_capabilities_spec.js index e3dd1b9ea2..648c92da21 100644 --- a/modules/angular2/test/core/compiler/reflection_capabilities_spec.js +++ b/modules/angular2/test/core/compiler/reflection_capabilities_spec.js @@ -31,6 +31,18 @@ export function main() { } describe('reflection capabilities', () => { + describe("factory", () => { + it("should create a factory for a type", () => { + var f = rc.factory(ClassWithField); + expect(f("value").field).toEqual("value"); + }); + + it("should throw when a constructor has more than 10 args", () => { + expect(() => rc.factory(ClassWith11Fields)).toThrowError( + new RegExp(`has more than 10 arguments`)); + }); + }); + it('can read out class annotations through annotations key', () => { assertTestClassAnnotations(rc.annotations(TestClass)); }); @@ -115,6 +127,17 @@ class TestClassTypesOnly { constructor(a: P1, b: P2) {} } +class ClassWithField { + field; + constructor(field) { + this.field = field; + } +} +class ClassWith11Fields { + constructor(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { + } +} + // Mocking the data stored in global.Reflect as if TS was compiling TestClass above. var mockDataForTestClassTypesOnly = { 'annotations': null,