feat(di): drop support for injecting types with generics in Dart
BREAKING CHANGE: In Dart we used to support injecting types with generics. As this feature is hard to implement with the upcoming codegen we are dropping it. Merge cl/115454020 in G3 with this change. Closes #7262
This commit is contained in:
parent
f72f137261
commit
c9a3df970b
@ -31,7 +31,7 @@ export {
|
|||||||
ResolvedProvider,
|
ResolvedProvider,
|
||||||
provide
|
provide
|
||||||
} from './di/provider';
|
} from './di/provider';
|
||||||
export {Key, TypeLiteral} from './di/key';
|
export {Key} from './di/key';
|
||||||
export {
|
export {
|
||||||
NoProviderError,
|
NoProviderError,
|
||||||
AbstractProviderError,
|
AbstractProviderError,
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
import {stringify, CONST, Type, isBlank} from 'angular2/src/facade/lang';
|
import {stringify, CONST, Type, isBlank} from 'angular2/src/facade/lang';
|
||||||
import {BaseException, WrappedException} from 'angular2/src/facade/exceptions';
|
import {BaseException, WrappedException} from 'angular2/src/facade/exceptions';
|
||||||
import {TypeLiteral} from './type_literal';
|
|
||||||
import {resolveForwardRef} from './forward_ref';
|
import {resolveForwardRef} from './forward_ref';
|
||||||
|
|
||||||
export {TypeLiteral} from './type_literal';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A unique object used for retrieving items from the {@link Injector}.
|
* A unique object used for retrieving items from the {@link Injector}.
|
||||||
*
|
*
|
||||||
@ -53,13 +50,6 @@ export class KeyRegistry {
|
|||||||
get(token: Object): Key {
|
get(token: Object): Key {
|
||||||
if (token instanceof Key) return token;
|
if (token instanceof Key) return token;
|
||||||
|
|
||||||
// TODO: workaround for https://github.com/Microsoft/TypeScript/issues/3123
|
|
||||||
var theToken = token;
|
|
||||||
if (token instanceof TypeLiteral) {
|
|
||||||
theToken = token.type;
|
|
||||||
}
|
|
||||||
token = theToken;
|
|
||||||
|
|
||||||
if (this._allKeys.has(token)) {
|
if (this._allKeys.has(token)) {
|
||||||
return this._allKeys.get(token);
|
return this._allKeys.get(token);
|
||||||
}
|
}
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
library angular2.di.type_literal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Use type literals as DI keys corresponding to generic types.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* ```
|
|
||||||
* Injector.resolveAndCreate([
|
|
||||||
* bind(new TypeLiteral<List<int>>()).toValue([1, 2, 3])
|
|
||||||
* ]);
|
|
||||||
*
|
|
||||||
* class Foo {
|
|
||||||
* // Delend on `List<int>` normally.
|
|
||||||
* Foo(List<int> list) { ... }
|
|
||||||
* }
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* This capability might be added to the language one day. See:
|
|
||||||
*
|
|
||||||
* https://code.google.com/p/dart/issues/detail?id=11923
|
|
||||||
*/
|
|
||||||
class TypeLiteral<T> {
|
|
||||||
const TypeLiteral();
|
|
||||||
Type get type => T;
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
/**
|
|
||||||
* Type literals is a Dart-only feature. This is here only so we can x-compile
|
|
||||||
* to multiple languages.
|
|
||||||
*/
|
|
||||||
export class TypeLiteral {
|
|
||||||
get type(): any { throw new Error("Type literals are only supported in Dart"); }
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
/// This file contains tests that make sense only in Dart
|
|
||||||
library angular2.test.di.injector_dart_spec;
|
|
||||||
|
|
||||||
import 'package:angular2/testing_internal.dart';
|
|
||||||
import 'package:angular2/core.dart';
|
|
||||||
|
|
||||||
main() {
|
|
||||||
describe('Injector', () {
|
|
||||||
it('should support TypeLiteral', () {
|
|
||||||
var i = Injector.resolveAndCreate([
|
|
||||||
bind(new TypeLiteral<List<int>>()).toValue([1, 2, 3]),
|
|
||||||
Foo,
|
|
||||||
]);
|
|
||||||
expect(i.get(Foo).value).toEqual([1, 2, 3]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class Foo {
|
|
||||||
final List<int> value;
|
|
||||||
Foo(this.value);
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
/// This file contains tests that make sense only in Dart
|
|
||||||
library angular2.test.di.key_dart_spec;
|
|
||||||
|
|
||||||
import 'package:angular2/testing_internal.dart';
|
|
||||||
import 'package:angular2/core.dart';
|
|
||||||
import 'package:angular2/src/core/di/key.dart';
|
|
||||||
|
|
||||||
main() {
|
|
||||||
describe('TypeLiteral', () {
|
|
||||||
it('contains type', () {
|
|
||||||
var t = new TypeLiteral<List<int>>();
|
|
||||||
expect('${t.type}').toEqual('List<int>');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can be a constant', () {
|
|
||||||
var a = const TypeLiteral<List<int>>();
|
|
||||||
var b = const TypeLiteral<List<int>>();
|
|
||||||
expect(identical(a, b)).toBe(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can be unique', () {
|
|
||||||
var a = const TypeLiteral<List<String>>();
|
|
||||||
var b = const TypeLiteral<List<int>>();
|
|
||||||
expect(identical(a, b)).toBe(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Key', () {
|
|
||||||
KeyRegistry registry;
|
|
||||||
|
|
||||||
beforeEach(() {
|
|
||||||
registry = new KeyRegistry();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('understands TypeLiteral', () {
|
|
||||||
var k = registry.get(const TypeLiteral<List<int>>());
|
|
||||||
expect('${k.token}').toEqual('List<int>');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
@ -42,27 +42,6 @@ void functionThatThrowsNonError() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
describe('TypeLiteral', () {
|
|
||||||
it(
|
|
||||||
'should publish via viewBindings',
|
|
||||||
inject([TestComponentBuilder, AsyncTestCompleter], (tb, async) {
|
|
||||||
tb
|
|
||||||
.overrideView(
|
|
||||||
Dummy,
|
|
||||||
new ViewMetadata(
|
|
||||||
template:
|
|
||||||
'<type-literal-component></type-literal-component>',
|
|
||||||
directives: [TypeLiteralComponent]))
|
|
||||||
.createAsync(Dummy)
|
|
||||||
.then((tc) {
|
|
||||||
tc.detectChanges();
|
|
||||||
expect(asNativeElements(tc.debugElement.children))
|
|
||||||
.toHaveText('[Hello, World]');
|
|
||||||
async.done();
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Error handling', () {
|
describe('Error handling', () {
|
||||||
it(
|
it(
|
||||||
'should preserve Error stack traces thrown from components',
|
'should preserve Error stack traces thrown from components',
|
||||||
@ -216,19 +195,6 @@ class Dummy {
|
|||||||
dynamic value;
|
dynamic value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Component(
|
|
||||||
selector: 'type-literal-component',
|
|
||||||
viewBindings: const [
|
|
||||||
const Binding(const TypeLiteral<List<String>>(),
|
|
||||||
toValue: const <String>['Hello', 'World'])
|
|
||||||
])
|
|
||||||
@View(template: '{{list}}')
|
|
||||||
class TypeLiteralComponent {
|
|
||||||
final List<String> list;
|
|
||||||
|
|
||||||
TypeLiteralComponent(this.list);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Component(selector: 'throwing-component')
|
@Component(selector: 'throwing-component')
|
||||||
@View(template: '')
|
@View(template: '')
|
||||||
class ThrowingComponent {
|
class ThrowingComponent {
|
||||||
|
@ -1313,8 +1313,6 @@ var NG_CORE = [
|
|||||||
'GetTestability:dart',
|
'GetTestability:dart',
|
||||||
'setTestabilityGetter()',
|
'setTestabilityGetter()',
|
||||||
'Type:js',
|
'Type:js',
|
||||||
'TypeLiteral',
|
|
||||||
'TypeLiteral.type',
|
|
||||||
'PACKAGE_ROOT_URL',
|
'PACKAGE_ROOT_URL',
|
||||||
'View',
|
'View',
|
||||||
'View.directives',
|
'View.directives',
|
||||||
|
@ -446,8 +446,6 @@ const CORE = [
|
|||||||
'TypeDecorator',
|
'TypeDecorator',
|
||||||
'TypeDecorator.Class(obj:ClassDefinition):ConcreteType',
|
'TypeDecorator.Class(obj:ClassDefinition):ConcreteType',
|
||||||
'TypeDecorator.annotations:any[]',
|
'TypeDecorator.annotations:any[]',
|
||||||
'TypeLiteral',
|
|
||||||
'TypeLiteral.type:any',
|
|
||||||
'ViewChildFactory',
|
'ViewChildFactory',
|
||||||
'ViewChildMetadata',
|
'ViewChildMetadata',
|
||||||
'ViewChildMetadata.constructor(_selector:Type|string)',
|
'ViewChildMetadata.constructor(_selector:Type|string)',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user